Mic*_* DN 1 c# linq datatable sum
我使用以下方法从数据表中获取总数
string total = dt.AsEnumerable().Sum(x => x.Field<decimal>("col1")).ToString();
Run Code Online (Sandbox Code Playgroud)
当col1的所有值都是数字时,这可以正常工作.
我的问题是 - 让我们考虑col1的任何一个值是否为字符串或null或除数字以外的任何其他值,上面的代码显然会抛出错误.
有没有办法检查值是否为数字,如果值不是数字,则使用"0".
我试过了 -
string total = dt.AsEnumerable().Sum(x => x.Field<decimal>("col1") is int ? x.Field<decimal>("col1") : 0).ToString();
Run Code Online (Sandbox Code Playgroud)
但不确定它是否正确.
请帮忙
如果它不是一个decimal而是string你甚至可以得到一个InvalidCastException在Field<T>方法.所以你必须知道它是什么类型.
我认为Col1 可以null,Field<T>支持可空类型:
decimal total = dt.AsEnumerable()
.Sum(r => r.Field<decimal?>("Col1") ?? 0);
Run Code Online (Sandbox Code Playgroud)
或不替换null为0:
decimal? total = dt.AsEnumerable()
.Sum(r => r.Field<decimal?>("Col1")); // use total.HasValue and total.Value
Run Code Online (Sandbox Code Playgroud)
假设string你可以使用decimal.TryParse:
decimal d = 0;
decimal total = dt.AsEnumerable()
.Where(r => decimal.TryParse(r.Field<string>("Col1"), out d))
.Sum(r => d);
Run Code Online (Sandbox Code Playgroud)
如果你不知道它是什么类型你可以使用object.ToString:
decimal total = dt.AsEnumerable()
.Where(r => !r.IsNull("Col1") && decimal.TryParse(r["Col1"].ToString(), out d))
.Sum(r => d);
Run Code Online (Sandbox Code Playgroud)
除此之外,为什么要将转换后的数字再次存储在字符串变量中?
| 归档时间: |
|
| 查看次数: |
9418 次 |
| 最近记录: |