2010-08-03 2 views
15

я пытался сделать что-то вроде этого -Как получить сумму списка шорт, используя метод расширения 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» не содержит определения для «Сумма» и лучший метод расширение перегрузка «System.Linq.Queryable.Sum (System.Linq.IQueryable)» имеют некоторые недопустимые аргументы

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

ответ

21
int s = listofshorts.Sum(d => d); 
+0

Это хорошо. Явное приведение * не является абсолютно необходимым *, но вам нужно будет предоставить эту простую лямбду. (Метод 'Sum' для' IEnumerable 'пропускает перегрузку без параметров.) –

+0

Я действительно задавался вопросом, будет ли это работать, но у него нет VS, способного его протестировать .... – cjk

+0

@ Энтони Пеграм Спасибо. Похоже, что 'short' не * в * в эти дни;) @ck Это преимущество того, что VS всегда открыт во время серфинга на SO;) –

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

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

+0

Я откровенно удивлен, что нет «короткой» версии Sum. Расскажите о отброшенном шаре. Изменить: о да, +1. :) – Randolpho

+4

-1, потому что это вызывает 'InvalidCastException' -' Cast() 'пытается распаковать с коротким' short' на 'int', что не получается. Я считаю, что он работал бы в .NET 3.5 до SP1. (Да, я написал программу для проверки :) –

+0

ну ладно. Это было хорошо в теории! +1 к Джону для фактического тестирования * на практике *, побуждая меня делать то же самое. –

7

Вы можете предоставить лямбда для метода:

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

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

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

Я думаю, вы пытаетесь убить муху кувалдой. Ваша процедура, ИМХО, является сложным способом решения простой проблемы. –

1

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

0

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

short sum = 0; 
myListOfShort.ForEach(val => sum += val) 
Смежные вопросы