C# Datatable—对行中的每个单元格求和
关于如何计算列中每个单元格的总和,有很多例子。例如,我还没有找到一个示例,说明如何对行中的每个单元格求和,并将该总数添加到名为“total”的新列中 C#DataTable具有C# Datatable—对行中的每个单元格求和,c#,datatable,C#,Datatable,关于如何计算列中每个单元格的总和,有很多例子。例如,我还没有找到一个示例,说明如何对行中的每个单元格求和,并将该总数添加到名为“total”的新列中 C#DataTable具有DataTable1.Compute(“SUM([“Column Name”]),”) 下面是我想做的例子。但是,我也希望能够排除特定列,因为它们可能不包含数字 编辑表格是动态的,列数可能会更改。DataTable具有创建计算列的功能。在您的情况下,您可以创建“总计”列作为 DataTable1.Columns.Add(
DataTable1.Compute(“SUM([“Column Name”]),”)
下面是我想做的例子。但是,我也希望能够排除特定列,因为它们可能不包含数字
编辑表格是动态的,列数可能会更改。DataTable具有创建计算列的功能。在您的情况下,您可以创建“总计”列作为
DataTable1.Columns.Add("Total", typeof(Double));
DataTable1.Columns["Total"].Expression = "C1+C2+C3";
您可以使用以下循环:
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);
}
这适用于任何列类型。我将尝试以下方法:
foreach (DataRow row in table.Rows) {
var rowSum = 0d;
foreach (DataColumn column in row.Table.Columns) {
//if row[column] is number
rowSum += Convert.ToDouble(row[column]));
//}
}
//at his point you have the the colums sum
}
试试这个
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);
}
DataTable1.Columns.Add(“Total”,typeof(Double));
foreach(DataTable1.Rows中的DataRow行)
{
int sum=row.Columns.Cast().sum(dc=>(int)row[dc]);
行设置字段(“总计”,总和);
}
Yuriy回答的示例代码:
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"]);
}
}
}
}
我冒昧地猜测,与lambda将我们的方式从每一行到每一列,甚至与循环每一行和每一列相比,这个(.Expression)是最有效的解决方案
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";
这是最简单的方法 Ah忘了提到它是一个动态创建的表,在SQL查询之后,列的数量是未知的。@Matt通过
foreach(DataTable1.columns中的DataColumn c)
构造表达式,然后将其传递给DataTable1的Expression@Matt是的,正如迈克尔指出的,在您将数据检索到DataTable中之后-此时您将知道列是什么,因此在检索数据之后创建计算列。通过这种方式,您可以循环遍历列,将所需的列添加到表达式中。这段代码是在什么API/SDK中编写的?这不是标准的System.Data.DataTable
您能解释一下.Expression=“C1+C2+C3”
吗?它是如何工作的?“然而,我也希望能够排除特定列,因为它们可能不包含数字。”——这符合OP的要求吗?
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";