基于列的不同的可枚举DataTable?

时间:2011-11-17 03:06:58

标签: c# datatable

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

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

基本上我有一个像这样的DataTable:

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

所以我想对不同的值做一个foreach,所以我会枚举Fruit一次,然后拿起苹果和梨,和VegeTables一次,拿起豆豆和胡萝卜。

我这样做是为了创建Accordion Panes,我想在一个标题下将我的结果分组,下面的代码会这样做,但是,它会创建两个Fruit的窗格,因为它没有意识到它已经通过了水果。 / p>

 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);
        }

1 个答案:

答案 0 :(得分:0)

使用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); 
            }
        }