2012-07-25 50 views
0

我有一個如下所示的數據表。我很難創建一個簡單的方法來組合像我列出的行。我需要能夠執行各種計算,例如爲一個ID累加所有年份,累計一年或類似的所有ID。我還需要系統地將一個id的所有年份和值分配給一組文本框,變量,或者我可以在邏輯上訪問它們。我想我最大的問題是確定如何轉換數據表,什麼是處理我需要做的最好的方法。C#數據表格到多維數組

當前

ID  Year  Value 

1  2010  25 
1  2010  25 
1  2009  30 
1  2008  5 
1  2008  5  
1  2008  5  
2  2010  1 
2  2010  4 
2  2009  0 
2  2008  25 
2  2008  25  
2  2008  25 

我想要什麼

ID  Year  Value 

1  2010  50 
     2009  30 
     2008  15 

2  2010  5 
     2009  0 
     2008  75 

我不能提交答案了,但是這是比較什麼,我要去了謝謝大家對你的幫助。

var Groups = 
      from DataRow row in dataset1.datatable1.Rows 
      group row by row["id"] into newGroup1 
      from newGroup2 in 
       (from row in newGroup1 
       group row by row["year"]).Distinct() 
      group newGroup2 by newGroup1.Key; 

     foreach (var outerGroup in Groups) 
     { 
      Console.WriteLine("Level = {0}", outerGroup.Key); 
      foreach (var innerGroup in outerGroup) 
      { 
       Console.WriteLine("Data = {0}", innerGroup.Key); 
       foreach (var innerGroupElement in innerGroup) 
       { 
        Console.WriteLine("\t\t{0}", innerGroupElement["Value"]); 
       } 
      } 
     } 

這給了我這樣的:

ID:1 
    Year:2008 
     Value:15 
    Year:2009 
     Value:30 
    Year:2010 
     Value:50 
ID:2 
    Year:2008 
     Value:75 
    Year:2009 
     Value:0 
    Year:2010 
     Value:5 
+2

參見[高效的DataTable集團通過( HTTP:// stackoverfl ow.com/questions/8472005/efficient-datatable-group-by) – YetAnotherUser 2012-07-25 14:48:29

+0

看看[使用LINQ進行分組](http://code.msdn.microsoft.com/LINQ-to-DataSets-Grouping-c62703ea) – waldrumpus 2012-07-25 14:51:53

回答

2

您可以使用Linq-To-DataSetEnumerable.GroupBy

var yearGroups = tbl.AsEnumerable() 
    .GroupBy(r => new 
    { 
     ID = r.Field<int>("ID"), 
     Year = r.Field<int>("Year") 
    }); 

foreach (var yg in yearGroups) 
{ 
    Console.WriteLine("ID:{0} Year:{1} Sum:{2}" 
     , yg.Key.ID 
     , yg.Key.Year 
     , yg.Sum(r => r.Field<int>("Value"))); 
} 

輸出:

ID:1 Year:2010 Sum:50 
ID:1 Year:2009 Sum:30 
ID:1 Year:2008 Sum:15 
ID:2 Year:2010 Sum:5 
ID:2 Year:2009 Sum:0 
ID:2 Year:2008 Sum:75