Как получить сумму списка коротких замыканий с помощью дополнительной Суммы метода ()?

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

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

Я получил эту ошибку компиляции -

'Система. Наборы. Универсальный. Список' не содержит определение за 'Сумму' и лучшую дополнительную Систему 'перегрузки метода. Linq. Queryable. Сумма (Система. Linq. IQueryable)', имеет некоторые недействительные аргументы

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

16
задан Vishal 27 August 2010 в 20:39
поделиться

5 ответов

int s = listofshorts.Sum(d => d);
22
ответ дан 30 November 2019 в 16:49
поделиться

Для метода можно указать лямбда:

List<short> listofshorts= new List<short>(); 
int s = listofshorts.Sum(a => (int)a);
7
ответ дан 30 November 2019 в 16:49
поделиться
// This throws an InvalidCastException in .NET 3.5 SP1+
// DO NOT USE THIS CODE
listOfShorts.Cast<int>().Sum();

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

4
ответ дан 30 November 2019 в 16:49
поделиться

Вы можете сделать

int s = listofshorts.Aggregate((i1,i2) => i1+i2); 
2
ответ дан 30 November 2019 в 16:49
поделиться

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

PS мои реализации основаны на реализации Enumerable.Sum после того, как я чисто из любопытства взглянул на отражатель :-P

1
ответ дан 30 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: