2012-12-01 41 views
11

我有一個自定義類型(Money)有一個implict轉換爲十進制和一個重載運算符爲+。當我有這些類型的列表並調用linq Sum方法時,結果爲十進制,而不是Money。我怎樣才能給+話務員發起並從Sum歸還錢?運算符重載和Linq總和在C#

internal class Test 
{ 
    void Example() 
    { 
     var list = new[] { new Money(10, "GBP"), new Money(20, "GBP") }; 
     //this line fails to compile as there is not implicit 
     //conversion from decimal to money 
     Money result = list.Sum(x => x); 
    } 
} 


public class Money 
{ 
    private Currency _currency; 
    private string _iso3LetterCode; 

    public decimal? Amount { get; set; } 
    public Currency Currency 
    { 
     get { return _currency; } 
     set 
     { 
      _iso3LetterCode = value.Iso3LetterCode; 
      _currency = value; 
     } 
    } 

    public Money(decimal? amount, string iso3LetterCurrencyCode) 
    { 
     Amount = amount; 
     Currency = Currency.FromIso3LetterCode(iso3LetterCurrencyCode); 
    } 

    public static Money operator +(Money c1, Money c2) 
    { 
     if (c1.Currency != c2.Currency) 
      throw new ArgumentException(string.Format("Cannot add mixed currencies {0} differs from {1}", 
                 c1.Currency, c2.Currency)); 
     var value = c1.Amount + c2.Amount; 
     return new Money(value, c1.Currency); 
    } 

    public static implicit operator decimal?(Money money) 
    { 
     return money.Amount; 
    } 

    public static implicit operator decimal(Money money) 
    { 
     return money.Amount ?? 0; 
    } 
} 

回答

12

Sum只知道在System號碼類型。

您可以使用Aggregate這樣的:

Money result = list.Aggregate((x,y) => x + y); 

因爲這是調用Aggregate<Money>,它將使用Money.operator+並返回一個Money對象。

+3

我最終加入我自己的'Sum'公共靜態類MoneyHelpers { 公共靜態一筆錢(這IEnumerable的源,Func鍵選擇) {VAR 款項= source.Select(選擇); return monies.Aggregate((x,y)=> x + y); } } – ilivewithian

+0

偉大的提示。謝謝。 – Joe