2011-04-08 130 views
1

給定一個沒有總列或行的數據表。我如何使用LINQ添加一個Total Column和Total行來創建下面的表格?如何使用LINQ創建總計列和總計行?

TextColumn, NumberColumn0, NumberColumn1 Total 
A    1    4   5 
B    2    55   47 
C    2.3   DBNULL  2.3 
D    4    3   7 
Total   9.3   62   61.3 

謝謝!

恩,對於那些需要密碼的人。我目前使用這個總列:

public static void CreateTotalColumnByType(DataTable table, Type valueType) 
{ 
    // create expression 
    string expression = string.Empty; 

    // do not count the first column (used for string field) 
    for (int columnIndex = 1; columnIndex < table.Columns.Count; ++columnIndex) 
    { 
     if (columnIndex != table.Columns.Count - 1) 
     { 
      // add + 
      expression += String.Format("[{0}] + ", table.Columns[columnIndex].ColumnName); 
     } 
     else 
     { 
      // last column so don't add plus 
      expression += String.Format("[{0}]", table.Columns[columnIndex].ColumnName); 
     } 
    } 

    // add total column 
    DataColumn totalColumn = new DataColumn("Total", valueType, expression); 
    table.Columns.Add(totalColumn); 
} 

但我想用LINQ替換它。

+0

什麼是您的數據源是什麼樣子?它是Entity框架對象?數據表?一組對象?顯示一些代碼! – RQDQ 2011-04-08 14:34:43

+0

這是一個已經填充的數據表。 – 2011-04-08 14:35:22

回答

0

有很多方法可以做到這一點,這取決於你如何得到這個回來,你甚至不需要使用LINQ。

如果您使用標準類進行數據傳輸,則可以執行以下操作。

public class MyDataClass 
{ 
    public string TextColumn {get; set;} 
    public int NumberColumn0 {get; set;} 
    public int NumberColumn1 {get; set;} 
    public int Total 
    { 
     get { return NumberColumn0 + NumberColumn1; } 
    }  
} 

這樣你就不需要LINQ了。如果你真的想使用LINQ可以使用

var results = from x in MyDataList 
       select new { TextColumn = x.TextColumn, NumberColumn0 = x.NumberColumn0, 
          NumberColumn1 = x.NumberColumn1, 
          Total = x.NumberColumn1 + x.NumberColumn0}; 

如果你有一個變量數列或類似的東西,你可能不會使用LINQ有儘可能多的運氣,我們需要看到更多的得到一個真實的想法你在做什麼。

+0

這與數據表無關,是嗎? – 2011-04-08 14:41:36

+0

當答案爲不存在詳細信息時,可以將其轉換爲與數據表一起使用。 – 2011-04-13 12:30:10

4
//adds Total column 
var q1 = src.Select(x=>new { x.TextColumn 
          ,x.NumberColumn0 
          ,x.NumberColumn1 
          ,Total=x.NumberColumn0+x.NumberColumn1}); 

//adds Totals row 
var q2 = q1.Concat(new[]{new{ TextColumn="Total" 
          ,NumberColumn0 = src.Sum(_=>_.NumberColumn0) 
          ,NumberColumn1 = src.Sum(_=>_.NumberColumn1) 
          ,Total=q1.Sum(_=>_.Total)}}); 
+0

數字列的名稱是否可以通過反射派生?我希望能夠以更通用的方式使用它。 – 2011-04-08 14:45:58

+0

爲了使用匿名類型,您需要對屬性名稱進行硬編碼。 – 2011-04-08 14:56:17

+0

Eek,這似乎很有限 – 2011-04-08 14:58:42

0

你可以試試這個。

For each col As DataGridViewColumn in grid.Columns 
    '' You could try adding if here if there are exception columns 
    gRID.Item(col.Index, 0).Value = gRID.Rows.Cast(Of DataGridViewRow)().AsEnumerable().Sum(Function(c) Convert.ToDecimal(c.Cells(col.Index).Value)).ToString() 
Next 

I just enhance p.cambell's solution a bit