仅使用 LINQ 对包含数字属性的对象集合求和

2024-05-06

我有一个像这样的对象模型:

public class Quantity
{
    public decimal Weight { get; set; }
    public decimal Volume { get; set; }
    // perhaps more decimals...

    public static Quantity operator +(Quantity quantity1, Quantity quantity2)
    {
        return new Quantity()
        {
            Weight = quantity1.Weight + quantity2.Weight,
            Volume = quantity1.Volume + quantity2.Volume
        };
    }
}

public class OrderDetail
{
    public Quantity Quantity { get; set; }
}

public class Order
{
    public IEnumerable<OrderDetail> OrderDetails { get; set; }
}

现在我想介绍一个只读属性TotalQuantity on the Order类应该汇总所有 OrderDetails 的数量。

我想知道是否有比这更好的“LINQ 方式”:

public class Order
{
    // ...
    public Quantity TotalQuantity
    {
        get
        {
            Quantity totalQuantity = new Quantity();
            if (OrderDetails != null)
            {
                totalQuantity.Weight =
                    OrderDetails.Sum(o => o.Quantity.Weight);
                totalQuantity.Volume =
                    OrderDetails.Sum(o => o.Quantity.Volume);
            }
            return totalQuantity;
        }
    }
}

这不是一个好的解决方案,因为它会迭代 OrderDetails 两次。并且不支持类似的操作(即使 Quantity 类中提供了 + 运算符):

Quantity totalQuantity = OrderDetails.Sum(o => o.Quantity); // doesn't compile

在 LINQ 中是否有更好的方法来构建总和?

(仅出于理论兴趣,简单的 foreach 循环当然也能很好地完成其工作。)

感谢您的反馈!


Try:

OrderDetails.Select(o => o.Quantity).Aggregate((x, y) => x + y)

如果您不希望每次添加都有新的 Quantity 对象的开销(RE 注释),您可以使用类似以下内容的内容:

new Quantity {
    Weight = OrderDetails.Select(o => o.Quantity.Weight).Sum(),
    Volume = OrderDetails.Select(o => o.Quantity.Volume).Sum()
};

不像第一个那么好,而且比普通的更尴尬(而且更慢?)foreach loop.

您可以找到更多关于Aggregate() method on MSDN http://msdn.microsoft.com/en-us/library/bb548651.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅使用 LINQ 对包含数字属性的对象集合求和 的相关文章

随机推荐