使用dt.AsEnumerable()。对具有字符串/ null值的列求和

时间:2014-03-10 08:05:23

标签: c# linq datatable sum

我使用以下方法从数据表中获取总数

string total = dt.AsEnumerable().Sum(x => x.Field<decimal>("col1")).ToString();

当col1的所有值都是数字时,这可以正常工作。

我的问题是 - 让我们考虑col1的任何一个值是否为字符串或null或除number以外的任何其他值,上面的代码会明显抛出错误。

有没有办法检查值是否为数字,如果值不是数字则使用“0”。

我试过了 -

string total = dt.AsEnumerable().Sum(x =>  x.Field<decimal>("col1") is int ? x.Field<decimal>("col1") : 0).ToString();

但不确定它是否正确。

请帮忙

1 个答案:

答案 0 :(得分:6)

如果它不是decimal而是string,您甚至会在Field<T> method中获得InvalidCastException。所以你必须知道它是什么类型。

我认为Col1可以是nullField<T>支持可空类型:

decimal total = dt.AsEnumerable()
 .Sum(r => r.Field<decimal?>("Col1") ?? 0);

或未将null替换为0

decimal? total = dt.AsEnumerable()
 .Sum(r => r.Field<decimal?>("Col1")); // use total.HasValue and total.Value

假设string,您可以使用decimal.TryParse

decimal d = 0;
decimal total = dt.AsEnumerable()
 .Where(r => decimal.TryParse(r.Field<string>("Col1"), out d))
 .Sum(r => d);

如果你不知道它是什么类型,你可以使用object.ToString

decimal total = dt.AsEnumerable()
 .Where(r => !r.IsNull("Col1") && decimal.TryParse(r["Col1"].ToString(), out d))
 .Sum(r => d);

除此之外,为什么要将转换后的数字再次存储在字符串变量中?