在数据表中对列进行乘法运算

7
我在C#中有一个datatable,其中包含“price”列和“allocation”列,我需要将价格列乘以分配列,并将结果放在价格列中。是否有一种方法可以在不循环表格的情况下实现?我尝试过类似于以下内容的代码:
DataTable dt = getData();
dt.Columns["Price"].Expression = "Allocation * Price";

但显然这会给我带来以下异常:

Cannot set Expression property due to circular reference in the expression.

有没有其他方法可以完成这个任务?谢谢。


1
@BWC 嗯,这种方式是可行的,但实际上我需要乘以几个不同的列,基于不同的事情,所以“总计”可能并不总是表明我需要的内容。我宁愿不要有“借方总计”,“贷方总计”等列。(尽管如果其他方法都失败了,这就是我会退而求其次的方法。) - SuperTron
@TimRogers 是的,没错,但我认为C#内置的DT函数比我写的要更加优化:P - SuperTron
@SuperTron 我非常怀疑。首先,它必须将您的字符串表达式解析和编译成它可以理解的内容。这是它不必要做的工作。 - Tim Rogers
@TimRogers 这是一个很好的观点... - SuperTron
最终,您将循环遍历Datatable的行,Linq查询可能是最干净的解决方案,只要列的值始终能够转换为双精度浮点数,否则您可能需要进行一些tryParsing。 - BDubCook
显示剩余4条评论
4个回答

4
您可以使用LINQ表达式在一行中完成它:
dt.Rows.ForEach(x => x["Price"] = (double)x["Price"] * (double)x["Allocation"]);

2
一个不能编译的方法得到了4个赞?DataRowCollection不是List<DataRow>。但请不要使用dt.Rows.Cast<DataRow>().ToList().ForEach。最简单和高效的方法是使用普通的foreach循环。 - Tim Schmelter
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - userFog

2
你可以向DataTable中添加另一列:
dt.Columns.Add("TotalPrice", typeof(decimal));
dt["TotalPrice"] = "Allocation * Price";

1
添加一个新列,其值是从另外两个列计算得出的:
dt.Columns.Add("TotalPrice", typeof(decimal), "Allocation * Price");

采用这种方法,如果您更改PriceAllocationTotalPrice将始终是最新的。


0

如果您没有单独的列,当某些东西再次执行计算时会发生什么...

在某个时候,为了实现您想要的功能(而不引入大量潜在的“erm特性”),您需要添加到datatable中的代码量将比创建一个类来保存这些内容更费力。

从datatable读取并写入datatable并不难,绑定到一系列事物也不难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接