C # Как использовать BigInteger с этим лямбда-выражением? - PullRequest
1 голос
/ 20 марта 2011

var totalCost = Persons.Sum(x => BigInteger.Parse(x.cost.First(kv => kv.Key == "volvo").Value))

ОШИБКА:
Невозможно преобразовать лямбда-выражение в тип делегата 'System.Func< Persons,int >', поскольку некоторые из возвращаемых типов в блоке неявно не являютсяможно преобразовать в возвращаемый тип делегата.
Невозможно неявно преобразовать тип 'System.Numerics.BigInteger' в 'int'.Существует явное преобразование (вам не хватает приведения?)

Я использовал его с OrderByDescending, и он отлично работает.Я могу понять ошибку.Я просто не знаю, чем заменить Sum, чтобы он заработал.

Как правильно использовать BigInteger с этим утверждением?

Ответы [ 4 ]

5 голосов
/ 20 марта 2011

По существу, перегрузка метода Sum работает с BigInteger, начиная с .NET 4.0.Вы можете написать перегрузку, которая делает это самостоятельно, или использовать оператор более общего назначения Aggregate для суммирования:

var totalCost = Persons.Select(x => BigInteger.Parse(x.cost.First(kv => kv.Key == "volvo").Value))
                       .Aggregate(BigInteger.Zero, (sum, next) => sum + next);
2 голосов
/ 20 марта 2011

К сожалению, вы не можете.Нет перегрузки на Sum, которая занимает BigInteger, поэтому вам придется делать суммирование самостоятельно.

Вы всегда можете написать свой собственный метод расширения, хотя:

public static class EnumerableExtension
{
    public static BigInteger Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, BigInteger> selector)
    {
        BigInteger output = 0;

        foreach(TSource item in source)
        {
            output += selector(item);
        }

        return output;
    }
}

Пока этот класс находится в одном из ваших using пространств имен, теперь вы сможете вызывать Sum, как вы и просили.

1 голос
/ 20 марта 2011

Вы можете использовать Агрегат .

//written without an IDE...
var bigIntegerSum = Persons.Aggregate( (sum, next) => sum + next);
0 голосов
/ 20 марта 2011

Исходя из того, что ваша переменная называется totalCost, я собираюсь догадаться, что вы имеете дело с деньгами, и в этом случае decimal является лучшим типом, чем BigInteger.И поскольку decimal имеет перегрузку для Sum, он будет работать, если вы используете:

var totalCost = Persons.Sum(x =>
                     Decimal.Parse(x.cost.First(kv => kv.Key == "volvo").Value))
...