我有一个数据表列,其中包含一对由正斜杠'/'分隔的两个值(已解决/待定),例如:(10/22)
ColumnABC
---------
1/2
5/8
1/3
现在我想将此列'ColumnABC'的总和计算为(7/13)
我试过像
这样的东西 string expression = "SUM(" + dt.Columns[i].ColumnName + ")";
int sum = Convert.ToInt32(dt.Compute(expression, ""));
这适用于包含int值的所有其他列,但会抛出此“ColumnABC”的异常:Syntax error in aggregate argument: Expecting a single column argument with possible 'Child' qualifier.
答案 0 :(得分:3)
假设您可以访问LINQ(即.NET 3.5 +):
var tuple = dt.Rows.Cast<DataRow>()
.Select(row => row["ColumnABC"].ToString().Split('/'))
.Select(strs => new Tuple<int, int>(
Int32.Parse(strs[0]),
Int32.Parse(strs[1])))
.Aggregate((curr, next) => new Tuple<int, int>(
curr.Item1 + next.Item1,
curr.Item2 + next.Item2));
var result = String.Format("{0}/{1}", tuple.Item1, tuple.Item2);
答案 1 :(得分:3)
首先,确认您的数据源存在明显问题。
最好的办法是在数据库中创建一个函数,将这些函数拆分为两个字段,以便返回到您的存储库。
如果您无法更改数据库架构,那么只需遍历每条记录,应用一个函数来拆分代码中的项目,或者像这样:
var resolved = dt.Rows.ToList<DataRow>.Sum(r => r[i].Split("/")[0])
var pending = dt.Rows.ToList<DataRow>.Sum(r => r[i].Split("/")[1])
无论如何,这是我的头脑......
答案 2 :(得分:1)
“int sum”毫无意义。你有一个分数(整数是整数)。我认为你将不得不迭代这些价值观或写一些非常疯狂的东西。
DataTable table = new DataTable();
table.Columns.Add( "fraction", typeof( string ) );
table.Rows.Add( "1/2" );
table.Rows.Add( "5/8" );
table.Rows.Add( "1/3" );
int numerator = 0;
int denominator = 0;
foreach ( DataRow row in table.Rows )
{
string[] split = row[ 0 ].ToString().Split( '/' );
numerator += int.Parse( split[ 0 ] );
denominator += int.Parse( split[ 1 ] );
}
MessageBox.Show( numerator + "/" + denominator );
将这些值存储在两个单独的列中可能更有意义,然后您可以使用标准sql轻松获取每列的总和。