C#linq Sum()扩展为大数字

时间:2016-02-17 13:30:57

标签: c# .net linq

我有一个简单的Sum扩展名:

public static int? SumOrNull<TSource>(this IEnumerable<TSource> source, Func<TSource, int> projection)
{
    return source.Any()
        ? source.Sum(projection)
        : (int?)null;
}

但它会导致System.OverflowException: Arithmetic operation resulted in an overflow.

我想做的是这样的事情:

public static ulong? SumOrNull<TSource>(this IEnumerable<TSource> source, Func<TSource, int> projection)
{
    return source.Any()
        ? source.Sum(projection)
        : (ulong?)null;
}

但Linq Sum没有重载,因此返回ulong和编译错误。 有什么方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:5)

您可以手动实施。这是一个例子:

KeepAlive

答案 1 :(得分:1)

Sum方法有overload,但您需要传递IEnumerable<long>,为了做到这一点,您可以将投影结果投射到long

public static ulong? SumOrNull<TSource>(this IEnumerable<TSource> source, Func<TSource, int> projection)
{
  return source.Any()
          ? (ulong?)source.Sum(x => (long)projection(x))
          : null;
}

答案 2 :(得分:1)

如果您坚持ulong(不是long),则可以使用Aggregate代替Sum

public static ulong? SumOrNull<TSource>(IEnumerable<TSource> source, 
                                        Func<TSource, ulong> projection) {
   return source.Any()
     ? source.Aggregate((ulong?) 0, (s, x) => s + projection(x))
     : null;
}