ReturnItems我正在尝试查找退回的单个商品的数量超过该商品的原始订购数量的列表。所以这里有 2 个不同的对象列表 -IEnumerable<ReturnItem>和IEnumerable<OrderItem>. 问题在于,根据进行退货的来源(我们的工作流程中有多个地方可以进行退货),给ItemNumber定的 on aReturnItem可能为空。在这种情况下,我们需要依靠 来ReturnItem.OrderItemId将它与OrderItem.
我已经使用 LINQ 解决了这个问题,但它需要一个嵌套的 for 循环(在引擎盖下)所以我试图尽可能避免这种情况同时保持可读性。换句话说,我想避免 O(N ^2) 并寻找 O(N) 或更好但又一次,同时保持可读性(我知道我在这里要求很多但我想我会看看是否有人有创造性的解决方案)。我创建了一个解决方案,其中我有两个用于订单项的字典。其中一个,键是项目编号,另一个键是订单项目 ID。这有效并解决了性能问题,但我完全失去了可读性。
这是我的原始 LINQ 语句:
// ItemsForReturn = IEnumerable<ReturnItem>
// OrderItems = IEnumerable<OrderItem>
var invalidQuantityItems = message.ItemsForReturn.Where(returnItem =>
{
var matchingOrderItemQuantity = message.OrderItems
.Where(orderItem => orderItem.ItemNumber.Equals(returnItem.ItemNumber) || orderItem.OrderItemId == returnItem.OrderItemId)
.Sum(orderItem => orderItem.Quantity);
return matchingOrderItemQuantity < returnItem.Quantity;
});
以及上面使用的变量的相应类型:
public class ReturnItem
{
public int OrderItemId {get; set;}
public string ItemNumber {get; set;}
public int Quantity {get; set;}
// There's more properties but these are the ones that matter
{
public class OrderItem
{
public int OrderItemId {get; set;}
public string ItemNumber {get; set;}
public int Quantity {get; set;}
// There's more properties but these are the ones that matter
{
我希望这var invalidQuantityItems将是一个IEnumerable<ReturnItems>其单个项目的数量大于订购的数量(即他们试图返回比他们首先订购的更多)。
幕布斯7119047
喵喵时光机
幕布斯6054654
相关分类