簡體   English   中英

基於列的不同的可枚舉數據表?

[英]Distinct Enumerable DataTable based on column?

這就是我想要完成的。 我只想從Column [0]中的所有行中選擇唯一的值。

然后,我想從column [2]獲取所有不同的值,並將它們分組在column [0]上。

所以基本上我有一個DataTable像這樣:

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

因此,我想對不同的值進行介紹,因此我將枚舉一次水果,然后拾取蘋果和梨,再將VegeTables拾取,然后拾取豌豆和胡蘿卜。

我這樣做是為了創建“手風琴窗格”,在這里我想將結果分組到一個標題下,下面的代碼這樣做了,但是,它創建了兩個Fruit窗格,因為它沒有意識到它已經通過了Fruit。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM