2012-12-01 13 views
11

小数点への暗黙の変換と+のオーバーロードされた演算子を持つカスタム型(Money)があります。私がこれらのタイプのリストを持っていて、linq Sumメソッドを呼び出すと、結果は小数であり、Moneyではありません。 +オペレーターの存在を知らせ、Sumからお金を返すにはどうすればよいですか?C#の演算子オーバーロードとLinq合計

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

SumSystemで数タイプについて知っています。

あなたはこのようAggregateを使用することができます。

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

これはAggregate<Money>を呼び出しているので、それはあなたのMoney.operator+を使用してMoneyオブジェクトを返します。

+3

私は自分自身の 'Sum'のpublic staticクラスMoneyHelpersが { のpublic staticマネー合計(このIEnumerableをソース、のFunc セレクタ) { するvar金銭= source.Select(セレクター)を追加することになりました。 return monies.Aggregate((x、y)=> x + y); } } – ilivewithian

+0

大きなヒント。ありがとう。 – Joe