C#如何在这个Lambda表达式中使用BigInteger?

时间:2011-03-20 20:14:09

标签: c# lambda biginteger

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

错误:
无法将lambda表达式转换为委托类型“System.Func< Persons,int >” 因为块中的某些返回类型不能隐式转换为委托返回类型 无法将“System.Numerics.BigInteger”类型隐式转换为“int”。 存在显式转换(您是否错过了演员?)

我已将它与OrderByDescending一起使用,它运行正常。我能理解错误。我只是不知道要替换Sum以使其工作。

如何正确使用BigInteger该声明?

4 个答案:

答案 0 :(得分:5)

基本上,Sum方法的重载在.NET 4.0中不适用于BigInteger。您可以编写一个自己执行此操作的重载,或使用更通用的Aggregate运算符进行求和:

var totalCost = Persons.Select(x => BigInteger.Parse(x.cost.First(kv => kv.Key == "volvo").Value))
                       .Aggregate(BigInteger.Zero, (sum, next) => sum + next);

答案 1 :(得分:2)

不幸的是,你做不到。 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

答案 2 :(得分:1)

您可以使用Aggregate

//written without an IDE...
var bigIntegerSum = Persons.Aggregate( (sum, next) => sum + next);

答案 3 :(得分:0)

基于你的变量被称为“totalCost”的事实,我猜你正在处理钱,在这种情况下decimal是比BigInteger更好的类型。由于decimalSum有重载,因此如果使用:

,它将起作用
var totalCost = Persons.Sum(x =>
                     Decimal.Parse(x.cost.First(kv => kv.Key == "volvo").Value))