2013-09-27 43 views
3

有很多關於如何獲得列中每個單元格的總和的示例。例如,我一直無法找到如何將每個單元格合併到一個行中並將其添加到名爲「Total」的新列中的示例。Datatable - 一行中的每個單元格的總和

C#DataTable中有我想下面做什麼DataTable1.Compute("SUM(["Column Name"])", "")

例。不過,我也希望能夠排除特定列,因爲它們可能不包含數字。

enter image description here

編輯該表格是動態和列的數量可以改變。

回答

5

您可以使用此循環:

table.Columns.Add("Total", typeof(decimal)); 
foreach (DataRow row in table.Rows) 
{ 
    decimal rowSum = 0; 
    foreach (DataColumn col in table.Columns) 
    { 
     if(!row.IsNull(col)) 
     { 
      string stringValue = row[col].ToString(); 
      decimal d; 
      if(decimal.TryParse(stringValue, out d)) 
       rowSum += d; 
     } 
    } 
    row.SetField("Total", rowSum); 
} 

這應該與任何列類型的工作。

+0

很好的答案! – Vikrant

3

DataTable具有創建計算列的功能。你的情況,你可以創建「總計」列

DataTable1.Columns.Add("Total", typeof(Double)); 
DataTable1.Columns["Total"].Expression = "C1+C2+C3"; 
+0

+1 IIRC DataTable有這種能力 –

+0

啊忘了提及它是一個動態創建的表,其中列的數量是未知的,直到SQL查詢後。 – Matt

+1

@Matt通過foreach(DataTable1.Columns中的DataColumn c)構造表達式,然後將它傳遞給DataTable1的表達式 –

0

我會嘗試這樣的事:

​​
0

試試這個。對於尤里的回答

DataTable1.Columns.Add("Total", typeof(Double)); 

foreach (DataRow row in DataTable1.Rows) 
{ 
    int sum = row.Columns.Cast<DataColumn>().Sum(dc=>(int)row[dc]); 
    row.SetField("Total", sum); 
} 
+0

這個代碼在哪個API/SDK中?這不是標準的'System.Data.DataTable' – 2015-09-08 12:20:32

1

示例代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Data; 

namespace DynamicColumns 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine ("Total all quantity columns"); 

      var dt = new DataTable(); 
      dt.Columns.Add ("ProductName", typeof(string)); 
      dt.Columns.Add ("Qty1", typeof(int)); 
      dt.Columns.Add ("Qty2", typeof(int)); 
      dt.Columns.Add ("Qty3", typeof(int)); 

      { 
       var dr = dt.NewRow(); 
       dr ["ProductName"] = "Keyboard"; 
       dr ["Qty1"] = 2; 
       dr ["Qty2"] = 5; 
       dr ["Qty3"] = 6; 
       dt.Rows.Add (dr); 
      } 

      { 
       var dr = dt.NewRow(); 
       dr ["ProductName"] = "Mouse"; 
       dr ["Qty1"] = 5; 
       dr ["Qty2"] = 1; 
       dr ["Qty3"] = 2; 
       dt.Rows.Add (dr); 
      } 




      string expression = 

       string.Join (" + ", 
        dt.Columns.OfType<DataColumn>() 
         .Where(x => x.DataType == typeof(int)) 
         .Select(x => x.ColumnName) 
         .ToArray()); 

      dt.Columns.Add("Total", typeof(int)).Expression = expression; 


      Console.WriteLine ("Expression: {0}",expression); 

      Console.WriteLine ("\nProduct and totals"); 
      foreach (var r in dt.Rows.OfType<DataRow>()) { 
       Console.WriteLine ("{0} {1}", r["ProductName"], r["Total"]); 
      } 


     } 
    } 
} 

輸出:

Expression: Qty1 + Qty2 + Qty3 

Product and totals 
Keyboard 13 
Mouse 8 

我會大膽地猜測這個(.Expression)是最高效的解決方案相比,拉姆達-ING我們每行到每列的方式,甚至比較循環每行和每列

0
DataTable1.Columns.Add("C1", typeof(Double)); 
DataTable1.Columns.Add("C2", typeof(Double)); 
DataTable1.Columns.Add("C3", typeof(Double)); 
DataTable1.Columns.Add("Total", typeof(Double)); 
DataTable1.Columns["Total"].Expression = "C1+C2+C3"; 

這是最簡單的方法..!

+1

你能解釋一下'.Expression =「C1 + C2 + C3」'嗎?它是如何工作的? *「但是我也希望能夠排除特定列,因爲它們可能不包含數字。」* - 它是否符合此OP的要求? –

相關問題