c#可枚举.求和方法不';t型支架

c#可枚举.求和方法不';t型支架,c#,linq,lambda,C#,Linq,Lambda,对于c#Enumerable.Sum方法(IEnumerable,Func)不支持将ulong类型作为方法的返回类型,除非我将ulong强制转换为long public class A { public ulong id {get;set;} } publec Class B { public void SomeMethod(IList<A> listOfA) { ulong result = listofA.Sum(A => A

对于c#
Enumerable.Sum方法(IEnumerable,Func)
不支持将
ulong
类型作为方法的返回类型,除非我将ulong强制转换为
long

public class A
{
  public ulong id {get;set;}

} 




publec Class B
{
    public void SomeMethod(IList<A> listOfA)
    {
        ulong result = listofA.Sum(A => A.Id);
    }
}
公共A类
{
公共ulong id{get;set;}
} 
B级公共图书馆
{
公共方法(IList)
  • 除非我这样做

  • ulong result=(ulong)listOfA.Sum(A=>(long)A.Id)


    有没有办法不用强制转换就解决这个问题?谢谢!

    您可以使用
    Aggregate

    ulong result = listOfULongs.Aggregate((a,c) => a + c);
    
    或者在你的具体情况下

    ulong result = listOfA.Aggregate(0UL, (a,c) => a + c.Id);
    

    您也应该首先考虑是否应该使用一个无符号值类型。

    您可以编写自己的扩展方法来提供<代码> ULUN < /代码>的超载,因为它没有被提供为BCL:

    的一部分。
    public static ulong Sum<TSource>(
        this IEnumerable<TSource> source, Func<TSource, ulong> summer)
    {
        ulong total = 0;
    
        foreach(var item in source)
          total += summer(item);
    
        return total;
    }
    
    公共静态ulong Sum(
    此IEnumerable源,Func summer)
    {
    ulong总数=0;
    foreach(源中的var项)
    总计+=夏季(项目);
    返回总数;
    }
    
    答案不错,但这会导致编译器错误“CS0165使用未分配的局部变量‘total’”。你需要明确地分配
    总数。
    。谢谢,我是用SO编写代码的,没有通过编译器运行,我会更新它。谢谢回答!扩展方法似乎是一个很好的解决方案!@PhilipPittle-你有/使用LINQPad吗?@PhilipPittle-我想这意味着你在其他机器上使用它,你知道它有多好,除其他外,用于测试代码。谢谢,这似乎是解决问题的好方法。我之所以使用
    ulong
    是因为Id不能为负数。你认为我真的应该使用
    long
    来代替吗?@Z.Z.-如果你没有处理负数,并且你的总和超过
    9223372036854775,807
    ,但不超过
    18446744073709551615
    ,那么
    ulong
    是个好主意。否则
    long
    是个完美的选择。