Использование метода 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);
}

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