Использование метода sum в LINQ
Я пытаюсь суммировать значения в универсальная коллекция, я использовал тот же самый точный код для выполнения этой функции в других частях моего кода, но, похоже, есть проблема с ulong
тип данных?
код
Items.Sum(e => e.Value);
имеет следующие ошибки:
ошибка 15 вызов неоднозначен между следующих методов или свойств: '
System.Linq.Enumerable.Sum<System.Collections.Generic.KeyValuePair<int,ulong>>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,ulong>>, System.Func<System.Collections.Generic.KeyValuePair<int,ulong>,float>)
' и 'System.Linq.Enumerable.Sum<System.Collections.Generic.KeyValuePair<int,ulong>>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,ulong>>, System.Func<System.Collections.Generic.KeyValuePair<int,ulong>,decimal?>
)
public class Teststuff : BaseContainer<int, ulong, ulong>
{
public decimal CurrentTotal { get { return Items.Sum(e => e.Value); } }
public override void Add(ulong item, int amount = 1)
{
}
public override void Remove(ulong item, int amount = 1)
{
}
}
public abstract class BaseContainer<T, K, P>
{
/// <summary>
/// Pass in the owner of this container.
/// </summary>
public BaseContainer()
{
Items = new Dictionary<T, K>();
}
public BaseContainer()
{
Items = new Dictionary<T, K>();
}
public Dictionary<T, K> Items { get; private set; }
public abstract void Add(P item, int amount = 1);
public abstract void Remove(P item, int amount = 1);
}
2 ответов
Sum()
не имеет перегрузки, которая возвращает ulong
, и компилятор не может решить, какую из перегрузок, которые существуют для вызова.
вы можете помочь ему решить с помощью броска:
Items.Sum(e => (decimal)e.Value)
согласился, о Sum()
не имеет перегрузки, которая возвращает ulong
, и компилятор не может решить, какую из перегрузок, которые существуют для вызова. Однако, если вы бросаете долго, вы можете столкнуться с System.OverflowException: Arithmetic operation resulted in an overflow.
вместо этого вы можете создать такой метод расширения:
public static UInt64 Sum(this IEnumerable<UInt64> source)
{
return source.Aggregate((x, y) => x + y);
}
таким образом, вам не нужно беспокоиться о кастинге, и он использует собственное добавление типа данных.