Ответ 1
int s = listofshorts.Sum(d => d);
Я пытался сделать что-то вроде этого -
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)' имеет некоторые недопустимые аргументы
Может ли кто-нибудь предложить, как я могу использовать метод расширения для вычисления суммы шорт? По какой-то причине метод расширения не поддерживает его...
int s = listofshorts.Sum(d => d);
Вы можете указать лямбда для метода:
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();
В интересах потомства и указывая, что это, казалось бы, очевидное решение не работает - я собираюсь оставить этот ответ со следующими ссылками о поведении .NET 3.5 SP1 +:
Вы могли бы сделать
int s = listofshorts.Aggregate((i1,i2) => i1+i2);
Как и другие, вы должны указать короткие объекты в тип, поддерживаемый методом 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
Я бы выбрал расширение .ForEach(), здесь вам не нужно кастинг
short sum = 0;
myListOfShort.ForEach(val => sum += val)