问题 C#中的运算符重载和Linq求和


我有自定义类型(Money)有一个implict转换为十进制和一个重载的运算符 +。当我有这些类型的列表并调用linq Sum 方法结果是十进制,而不是 Money。我怎么能给 +运营商总统并从中返回资金 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;
    }
}

5400
2017-12-01 16:32


起源



答案:


Sum 只知道数字类型 System

您可以使用 Aggregate 喜欢这个:

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

因为这是在呼唤 Aggregate<Money>,它会使用你的 Money.operator+ 并返回一个 Money 目的。


12
2017-12-01 16:40



我最后添加了自己的 Sum     public static class MoneyHelpers {public static Money Sum <T>(此IEnumerable <T> source,Func <T,Money> selector){var monies = source.Select(selector); return monies.Aggregate((x,y)=> x + y); }} - ilivewithian
很棒的提示。谢谢。 - Joe


答案:


Sum 只知道数字类型 System

您可以使用 Aggregate 喜欢这个:

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

因为这是在呼唤 Aggregate<Money>,它会使用你的 Money.operator+ 并返回一个 Money 目的。


12
2017-12-01 16:40



我最后添加了自己的 Sum     public static class MoneyHelpers {public static Money Sum <T>(此IEnumerable <T> source,Func <T,Money> selector){var monies = source.Select(selector); return monies.Aggregate((x,y)=> x + y); }} - ilivewithian
很棒的提示。谢谢。 - Joe