我有一个简单的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和编译错误。 有什么方法可以做到这一点吗?
答案 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;
}