我有一个自定义类型(Money),它具有对十进制的隐含转换和一个重载的运算符.当我有这些类型的列表并调用
linq Sum方法结果是十进制,而不是金钱.如何给予经营者前提,并从金额返还资金?
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; } }
解决方法
总和只知道系统中的数字类型.
你可以这样使用Aggregate:
Money result = list.Aggregate((x,y) => x + y);
因为这是调用Aggregate< Money>,它将使用您的Money.operator并返回一个Money对象.