【发布时间】:2012-03-13 21:17:14
【问题描述】:
我想计算数据表中字符串数据类型列的总和。
我已经试过了:
Int32 omarks = Convert.ToInt32(dt.Compute("Sum(Convert(Marks, 'System.Int32'))", ""));
tbobtained.Text = omarks.ToString();
但是我收到了这个错误:
聚合参数中的语法错误:需要带有可能的子限定符的单列参数。
【问题讨论】:
我想计算数据表中字符串数据类型列的总和。
我已经试过了:
Int32 omarks = Convert.ToInt32(dt.Compute("Sum(Convert(Marks, 'System.Int32'))", ""));
tbobtained.Text = omarks.ToString();
但是我收到了这个错误:
聚合参数中的语法错误:需要带有可能的子限定符的单列参数。
【问题讨论】:
这个怎么样:
int omarks = dt.Rows.Select(dr=>(int)dr["Marks"]).Sum();
tbobtained.Text = omarks.ToString();
dr 是 lambda 函数的参数,它接受一个数据行(即 dr)并返回 Marks 列的整数值。
如果您想了解此代码为何有效,您需要了解LINQ 和C# lambda expressions。
【讨论】:
它一定不喜欢嵌套函数调用,即使documentation of the expression syntax 没有提到任何问题。
我尝试将对Convert() 的调用提取到这样的计算列中...
static void Main(string[] args)
{
int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
DataTable dt = CreateDataTable(data);
int omarks = Convert.ToInt32(dt.Compute("Sum(MarksInt)", ""));
string text = omarks.ToString();
Console.WriteLine(omarks == data.Sum());
}
static DataTable CreateDataTable(IEnumerable<int> data)
{
DataTable table = new DataTable();
table.Columns.Add("Marks", typeof(string));
table.Columns.Add("MarksInt", typeof(int), "Convert(Marks, 'System.Int32')");
foreach (int i in data)
{
DataRow row = table.NewRow();
row["Marks"] = i.ToString();
table.Rows.Add(row);
}
return table;
}
...它执行时不会抛出 Exception 并正确打印 true。
【讨论】:
Convert() 和 Sum() 确实有效,只是由于某种原因在一个表达式中组合在一起时不起作用。