Я пытался сделать что-то вроде этого -
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)', имеет некоторые недействительные аргументы
Кто-либо может предложить, как я могу использовать дополнительный метод для вычисления суммы коротких замыканий? По некоторым причинам дополнительный метод не поддерживает его...
Для метода можно указать лямбда:
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;
}
PS мои реализации основаны на реализации Enumerable.Sum после того, как я чисто из любопытства взглянул на отражатель :-P