2011-03-20 46 views
1

var totalCost = Persons.Sum(x => BigInteger.Parse(x.cost.First(kv => kv.Key == "volvo").Value))C#如何在这个Lambda表达式中使用BigInteger?

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

我和OrderByDescending使用它,它工作正常。我可以理解错误。我只是不知道要用什么来代替Sum才能使它工作。

如何正确使用BigInteger这句话?

回答

5

本质上,从.NET 4.0开始,Sum方法没有超载的方式与BigInteger一起使用。你可以写,做这个自己的过载,或使用更通用的Aggregate运营商做加法:

var totalCost = Persons.Select(x => BigInteger.Parse(x.cost.First(kv => kv.Key == "volvo").Value)) 
         .Aggregate(BigInteger.Zero, (sum, next) => sum + next); 
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按照您的要求。

1

您可以使用Aggregate

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

基于这样的事实,你的变量称为“TOTALCOST”,我会猜,你与金钱打交道,在这种情况下decimal是一个更好的类型比BigInteger。并且由于decimalSum有过载,所以如果使用:

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