2011-03-20 47 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))