我有一个存储过程返回4个不同的表,所以我创建了四个不同的数据表对象
DataTable dt1 = ds.Tables[0];
DataTable dt2 = ds.Tables[1];
DataTable dt3 = ds.Tables[2];
DataTable dt4 = ds.Tables[3];
第二个表dt2包含两列地址并已完成
address1................12
address2.................9
address3................14
address4................13
我想遍历第二个数据表并添加所有已完成的值并将其存储在局部变量comp中 我的解决方案如下
int comp = 0;
foreach (DataRow dr in dt2.Rows)
{
object o = dr["Completed"];
comp =+ Convert.ToInt32(o);
}
但是comp
的输出是13,但它应该是最后一列第二个数据表的48和,任何想法
答案 0 :(得分:2)
您使用错误的运算符进行添加分配您需要+=
而不是=+
。您拥有=+
的运营商意味着您拥有+Convert.ToInt32(o)
的+一元加法运算符,结果已分配给object o
comp =+ Convert.ToInt32(o);
意味着
comp = +Convert.ToInt32(o); Addition operator will be considered unary operator with Convert.ToInt32(o)
您的代码将是
foreach (DataRow dr in dt2.Rows)
{
object o = dr["Completed"];
comp += Convert.ToInt32(o);
}
如果+ =或 - =运算符的左操作数被归类为事件 访问,然后表达式评估如下:
- 评估事件访问的实例表达式(如果有)。
- 评估+ =或 - =运算符的右操作数,如果需要,通过以下方式转换为左操作数的类型 隐式转换(第6.1节)。
- 在评估之后调用事件的事件访问器,参数列表由右操作数组成,如果需要, 转换。如果运算符为+ =,则调用add访问器。如果 运算符为 - =,调用了remo ve访问器MSDN。
答案 1 :(得分:2)
Adil已rightly pointed out to the mistake,您也可以使用LINQ To DataSet/DataTable计算SUM
,如:
int comp = dt2.AsEnumerable()
.Sum(r => r.Field<int>("Completed"));
或者您可以使用DataTable.Compute
之类的:
int comp = Convert.ToInt32(dt2.Compute("Sum(Completed)", ""));