gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:56:17 31 4
gpt4 key购买 nike

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

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; }
}

现在我想在 Order 类上引入一个只读属性 TotalQuantity,它应该汇总所有 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 循环当然也能很好地完成它的工作。)

感谢反馈!

最佳答案

尝试:

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 循环稍微笨拙(而且更慢?)。

您可以找到有关Aggregate() 方法的更多信息on MSDN .

关于c# - 仅使用 LINQ 对包含数字属性的对象集合求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5612938/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com