使用dt.AsEnumerable().对具有字符串/空值的列求和
本文关键字:字符串 空值 求和 AsEnumerable dt 使用 | 更新日期: 2023-09-27 17:49:18
我正在使用以下方法从数据表中获取列的总数
string total = dt.AsEnumerable().Sum(x => x.Field<decimal>("col1")).ToString();
当col1的所有值都是number时,此方法可以正常工作。
我的问题是-让我们考虑如果col1的任何一个值是字符串或null或除数字以外的任何其他值,上面的代码显然会抛出错误。
是否有办法检查值是否为数字,如果值不是数字则使用'0'。
I tried -
string total = dt.AsEnumerable().Sum(x => x.Field<decimal>("col1") is int ? x.Field<decimal>("col1") : 0).ToString();
但不确定是否正确。
请帮
如果它不是decimal
而是string
,你甚至可以在Field<T>
方法中得到InvalidCastException
。所以你必须知道它是什么类型的。
我假设Col1
可以是null
, Field<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);
除此之外,为什么要将转换后的数字再次存储在字符串变量中?