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);
}