Как получить сумму списка шорт, используя метод расширения Sum()?

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

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)' имеет некоторые недопустимые аргументы

Может ли кто-нибудь предложить, как я могу использовать метод расширения для вычисления суммы шорт? По какой-то причине метод расширения не поддерживает его...

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Как и другие, вы должны указать короткие объекты в тип, поддерживаемый методом 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

Ответ 6

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

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