Как получить сумму списка шорт с помощью метода расширения Sum ()? - PullRequest
16 голосов
/ 03 августа 2010

Я пытался сделать что-то вроде этого -

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 ]

22 голосов
/ 03 августа 2010
int s = listofshorts.Sum(d => d);
7 голосов
/ 03 августа 2010

Вы можете указать лямбду для метода:

List<short> listofshorts= new List<short>(); 
int s = listofshorts.Sum(a => (int)a);
4 голосов
/ 03 августа 2010
// This throws an InvalidCastException in .NET 3.5 SP1+
// DO NOT USE THIS CODE
listOfShorts.Cast<int>().Sum();

В интересах потомков, и указание на это, казалось бы, очевидное решение не работает - я оставлю этот ответ со следующими ссылками на поведение .NET 3.5 SP1 +:

2 голосов
/ 03 августа 2010

Вы могли бы сделать

int s = listofshorts.Aggregate((i1,i2) => i1+i2); 
1 голос
/ 03 августа 2010

Как и другие, вам нужно привести короткие объекты к типу, который поддерживается методом Enumerable.Sum . К сожалению, нет перегруженного метода Sum для некоторых типов, таких как ulong и т. Д.

Если вы будете нуждаться в этом очень часто, я бы порекомендовал написать метод расширения самостоятельно, вот один, который я сделал некоторое время назад для 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

0 голосов
/ 30 сентября 2011

Я бы, вероятно, выбрал расширение .ForEach (), здесь вам не нужно кастинг

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