C# 求和法在LINQ中的应用

C# 求和法在LINQ中的应用,c#,.net,linq,generics,C#,.net,Linq,Generics,我试图总结一个泛型集合中的值,我在我的其他代码片段中使用了相同的精确代码来执行此函数,但它似乎与ulong数据类型有问题 代码 Items.Sum(e => e.Value); 出现以下错误: 错误15以下方法或属性之间的调用不明确:“System.Linq.Enumerable.Sum(System.Collections.Generic.IEnumerable,System.Func)”和“System.Linq.Enumerable.Sum(System.Collectio

我试图总结一个泛型集合中的值,我在我的其他代码片段中使用了相同的精确代码来执行此函数,但它似乎与
ulong
数据类型有问题

代码

   Items.Sum(e => e.Value); 
出现以下错误:

错误15以下方法或属性之间的调用不明确:“
System.Linq.Enumerable.Sum(System.Collections.Generic.IEnumerable,System.Func)
”和“
System.Linq.Enumerable.Sum(System.Collections.Generic.IEnumerable,System.Func

公共类Teststuff:BaseContainer
{
public decimal CurrentTotal{get{return Items.Sum(e=>e.Value);}
公共覆盖无效添加(ulong项,整数金额=1)
{
}
公共覆盖无效删除(ulong项目,整数金额=1)
{
}
}
公共抽象类BaseContainer
{
/// 
///将此容器的所有者传递进来。
/// 
公共BaseContainer()
{
Items=新字典();
}
公共BaseContainer()
{
Items=新字典();
}
公共字典项{get;private set;}
公开摘要作废增加(P项,整数金额=1);
公开摘要作废删除(P项,整笔金额=1);
}
Sum()
没有返回
ulong
的重载,编译器无法决定调用哪些重载

您可以通过演员阵容帮助其做出决定:

Items.Sum(e => (decimal)e.Value)
商定的
Sum()
没有返回
ulong
的重载,并且编译器无法决定调用哪些重载。但是,如果强制转换为long,则可能会遇到
System.OverflowException:算术运算导致溢出。

相反,您可以创建如下扩展方法:

public static UInt64 Sum(this IEnumerable<UInt64> source)
{
    return source.Aggregate((x, y) => x + y);
}
公共静态UInt64和(此IEnumerable源)
{
返回源.聚合((x,y)=>x+y);
}

这样,您就不必担心强制转换,它使用本机数据类型添加。

谢谢,我刚刚将所有的ulong都更改为十进制,我会在计时器启动后立即接受。@lakedoo:请注意,如果您更改
值的类型
,则不需要强制转换。还有,你确定你不想要长的吗?好的,是的,我要用长的,它似乎没有任何问题。再次感谢@lakedoo小心溢出问题。将
ulong
s相加并期望
long
看起来很危险。要么你的属性一开始就不应该是
ulong
(如果它们确实需要这样的精度,那么求和就会失败),要么你应该为
sum
编写一个扩展来处理
ulong
@jb1t的答案是最好的答案。它风险更小(没有溢出异常),效率更高,因为它可以避免强制转换列表中的每个项目
public static UInt64 Sum(this IEnumerable<UInt64> source)
{
    return source.Aggregate((x, y) => x + y);
}