【问题标题】:Distinct Enumerable DataTable based on column?基于列的不同可枚举数据表?
【发布时间】:2011-11-17 03:06:58
【问题描述】:

这就是我想要完成的。我只想从 Column[0] 中的所有行中选择不同的值。

然后我想从 column[2] 中获取所有不同的值并将它们分组到 column[0] 上。

所以基本上我得到了一个像这样的数据表:

Fruit|Apples
Fruit|Pears
Vegetables|Peas
Vegetables|Carrots

所以我想对不同的值进行 foreach,所以我会枚举 Fruit 一次,然后选择 Apples 和 Pears,以及 VegeTables 一次,然后选择 Peas 和 Carrots。

我这样做是为了创建手风琴窗格,我想将我的结果分组到一个标题下,下面的代码这样做了,但是,它创建了两个水果窗格,因为它没有意识到它已经通过了水果。

 foreach (DataRow dtrow in dtTable.Rows)
        {
            string idRow = dtrow[0].ToString();
            AccordionPane currentPane = new AccordionPane();
            currentPane.ID = "AccordionPane" + Guid.NewGuid().ToString();
            currentPane.HeaderContainer.Controls.Add(new LiteralControl(dtrow[0].ToString()));
            foreach(DataRow dtRow2 in dtTable.Rows)
            {
                if(dtRow2[0].ToString() == idRow)
                {
                    currentPane.ContentContainer.Controls.Add(new LiteralControl(dtRow2[1].ToString()));
                }
            }
            NavigateAccordion.Panes.Add(currentPane);
        }

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    你可以在使用 linq 时轻松完成此操作,请自行查看:

    var groupedRows = from row in dtTable.Rows.AsEnumerable()
                      group row by row[0] into grouped
                      select grouped;
    
    foreach (var group in groupedRows)
    {
        currentPane = new AccordionPane();
        currentPane.HeaderContainer.Controls.Add(group.Key.ToString());
    
        foreach (var row in group)
        {
            currentPane.ContentContainer.Controls.Add(row[1].ToString());
        }   
    }
    

    或者,如果您想坚持当前的非 linq 方法:

    foreach (DataRow dtrow in dtTable.Rows) 
            { 
                bool skip = false;
    
                foreach (var pane in NavigateAccordion.Panes)
                {
                    if (pane.HeaderContainer.Controls[0].Text == dtRow[0].ToString())
                    {
                        skip = true;
                        break;
                    }
                }
    
                if (!skip)
                {
                    string idRow = dtrow[0].ToString(); 
                    AccordionPane currentPane = new AccordionPane(); 
                    currentPane.ID = "AccordionPane" + Guid.NewGuid().ToString(); 
                    currentPane.HeaderContainer.Controls.Add(new LiteralControl(dtrow[0].ToString())); 
                    foreach(DataRow dtRow2 in dtTable.Rows) 
                    { 
                        if(dtRow2[0].ToString() == idRow) 
                        { 
                            currentPane.ContentContainer.Controls.Add(new LiteralControl(dtRow2[1].ToString())); 
                        } 
                    } 
                    NavigateAccordion.Panes.Add(currentPane); 
                }
            } 
    

    【讨论】:

    • @mike - 只是好奇?为什么没有linq?你可以很容易地创建一个没有 linq 的类似方法,但这将包括很多额外的工作
    • 我收到此错误消息 错误 54 找不到源类型“System.Data.DataRowCollection”的查询模式的实现。未找到“GroupBy”。
    • 主要是因为我对 linq 的了解不够充分,无法将它操作到我觉得舒服的程度
    • @Mike - 更新了我的答案,既可以修复 linq 方式,也可以为您提供一种没有 linq 的方法(您应该在数据表上调用 AsEnumerable(不是 100% 确定名称)
    • 我得到的只是 AsParalle / AsQueryable
    猜你喜欢
    • 2019-05-12
    • 2010-10-12
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2019-02-07
    • 2016-07-24
    相关资源
    最近更新 更多