如何使用扩展方法Sum()得到短裤列表的总和?

时间:2010-08-03 15:06:24

标签: c# linq extension-methods

我试图做这样的事情 -

List<short> listofshorts= new List<short>();
int s = listofshorts.Sum();
//this does not work...but same code works for a list of ints..

我收到了这个编译错误 -

  

'System.Collections.Generic.List'不包含'Sum'的定义,最好的扩展方法重载'System.Linq.Queryable.Sum(System.Linq.IQueryable)'有一些无效的参数

有人可以建议我如何使用扩展方法来计算短裤的总和?由于某种原因,扩展方法不支持它...

6 个答案:

答案 0 :(得分:22)

int s = listofshorts.Sum(d => d);

答案 1 :(得分:7)

您可以为方法提供lambda:

List<short> listofshorts= new List<short>(); 
int s = listofshorts.Sum(a => (int)a);

答案 2 :(得分:4)

// This throws an InvalidCastException in .NET 3.5 SP1+
// DO NOT USE THIS CODE
listOfShorts.Cast<int>().Sum();

为了后代的利益,并指出这个看似显而易见的解决方案不起作用 - 我将通过以下关于.NET 3.5 SP1 +行为的链接留下这个答案:

答案 3 :(得分:2)

你可以做到

int s = listofshorts.Aggregate((i1,i2) => i1+i2); 

答案 4 :(得分:1)

与其他人建议的一样,您需要将短对象转换为Enumerable.Sum方法支持的类型。不幸的是,对于某些类型(如ulong等)没有重载的Sum方法。

如果你经常需要它,我建议你自己写一个扩展方法,这是我为ulong和ulong做了一段时间的那个吗?你可以做一些非常类似的简短或任何其他类型你需要:

    public static ulong Sum(this IEnumerable<ulong> source)
    {
        var sum = 0UL;

        foreach (var number in source)
        {
            sum += number;
        }

        return sum;
    }

    public static ulong? Sum(this IEnumerable<ulong?> source)
    {
        var sum = 0UL;

        foreach (var nullable in source)
        {
            if (nullable.HasValue)
            {
                sum += nullable.GetValueOrDefault();
            }                
        }

        return sum;
    }

P.S。我的实现是基于Enumerable.Sum实现后,我纯粹出于好奇而偷看了反射器:-P

答案 5 :(得分:0)

我可能会选择.ForEach()扩展名,这里不需要任何转换

short sum = 0;
myListOfShort.ForEach(val => sum += val)