我有一个像这样的对象模型:
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
类上引入一个只读属性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循环当然也可以很好地完成它的工作。)
感谢您的反馈!
答案 0 :(得分:18)
尝试:
OrderDetails.Select(o => o.Quantity).Aggregate((x, y) => x + y)
如果您不希望每次添加(RE注释)都有新的Quantity对象的开销,您可以使用以下内容:
new Quantity {
Weight = OrderDetails.Select(o => o.Quantity.Weight).Sum(),
Volume = OrderDetails.Select(o => o.Quantity.Volume).Sum()
};
不如第一个好,并且比仅仅foreach
循环稍微笨拙(并且更慢?)。
您可以找到有关Aggregate()
方法on MSDN的更多信息。