开发者

How to get the sum of list of shorts using the extension method Sum()?

I was trying to do something like this -

List<short> listof开发者_开发问答shorts= new List<short>();
int s = listofshorts.Sum();
//this does not work...but same code works for a list of ints..

I got this compilation error -

'System.Collections.Generic.List' does not contain a definition for 'Sum' and the best extension method overload 'System.Linq.Queryable.Sum(System.Linq.IQueryable)' has some invalid arguments

Can anyone suggest how can I use an extension method to calculate the sum of shorts? For some reason the extension method does not support it ...


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


You can provide the lambda for the method:

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


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

In the interest of posterity, and pointing out this seemingly obvious solution doesn't work - I'm going to leave this answer with the following links about .NET 3.5 SP1+ behavior:

  • Puzzling Enumerable.Cast InvalidCastException
  • http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/08/10/net-fx-3-5-sp1-two-perf-improvements-linq-to-objects-and-linq-to-sql.aspx
  • http://blogs.msdn.com/b/ed_maurer/archive/2008/02/16/breaking-change-in-linq-queries-using-explicitly-typed-range-variables.aspx


You could do

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


Like the others have suggested, you will need to cast the short objects to a type which is supported by the Enumerable.Sum method. Unfortunately there are no overloaded Sum method for some of the types like ulong, etc.

If you're gonna be needing it very often though, I'd recommend writing an extension method yourself, here's one I did a while back for ulong and ulong?, you can do something very similar for short or any other types you need:

    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. my implementations are based on the Enumerable.Sum implementation after I took a peek with reflector purely out of curiosity :-P


I would probably chose the .ForEach() extension, you don't need any casting here

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜