2010-08-13 193 views
2

我該如何聚合(使用LINQ)其中一列相同的數據集的一列的值。聚合一個數據集

例如,我的專欄是

Row1 Row2 

2  3 
4  5 
6  7 
2  2 
6  4 
7  4 
2  4 

我需要的是這樣的

Row1 Row2 

2 9 
4 5 
6 11 
7 4 

編輯:值在 「行2」 是 「ROW1」 的數量。所以(例如:2)的值必須彙總到一個新的數據表中,其中(2)只有一個條目。 如果問題含糊不清,我很抱歉。

+0

http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumSimple – 2010-08-13 10:41:18

回答

5

您可以使用LINQ合計行和結果複製到一個新表:

DataTable source = // whatever 
DataTable dest = source.Clone(); 

var aggregate = source 
    .AsEnumerable() 
    .GroupBy(row => row.Field<int>("Row1")) 
    .Select(grp => new { Row1 = grp.Key, Row2 = grp.Select(r => r.Field<int>("Row2")).Sum() }); 

foreach(var row in aggregate) 
{ 
    dest.Rows.Add(new object[] { row.Row1, row.Row2 }); 
} 
+0

@Sam,@Lee:我強烈建議您使用'IEnumerable的 .CopyToDataTable()其中T:DataRow' HTTP ://msdn.microsoft.com/en-us/library/bb396189.aspx – abatishchev 2010-08-16 06:56:59

+0

我使用過。謝謝 – Sam 2010-08-16 10:32:45

+0

我們如何重構這段代碼才能使它適用於N列? – Karan 2014-05-08 08:45:49

1

添加參考System.Data.DataSetExtensions.dll

DataSet ds = .. 
DataTable table = ds.Tables[0]; // or ds.Tables["YourTableName"]; 

var q = from row in table.AsEnumerable() 
     group row by row.Field<int>("Row1") into g 
     select new 
     { 
      Row1 = g.Key, 
      Row2 = g.Sum(s => s.Field<int>("Row2")) 
     }; 

如果通過幾列需要組:

var q = from record in table.AsEnumerable() 
     group record by new { Row1 = record.Field<int>("Row1"), Row2 = record.Field<int>("Row3") } into g 
     select new 
     { 
      Row1 = g.Key, 
      Row2 = g.Sum(s => s.Field<int>("Row2")) 
     }; 
+0

@abatishchev:什麼是g.Key這裏。我正在查看我提供的鏈接,並試圖理解它。你能否提供一些解釋。 – 2010-08-13 10:46:05

+0

@Shantanu:'g.Key'是你分組的關鍵,在目前的情況下 - 'row.Field (「Row1」)' – abatishchev 2010-08-13 10:47:00

+0

@abatishchev:如果我有3列或更多列必須在所有其他專欄上進行分組。在那種情況下它將如何工作。 – 2010-08-13 10:48:34

0

如果您不想(想)使用Linq,您可以嘗試this微軟HOWTO並創建你自己的助手類。

+0

我需要使用linq! – Sam 2010-08-16 03:25:14