Я пытаюсь найти список ReturnItems
, в котором количество возвращаемого отдельного товара превышает исходное заказанное количество для этого товара. Таким образом, здесь есть 2 разных списка объектов - IEnumerable<ReturnItem>
и IEnumerable<OrderItem>
. Проблема заключается в том, что в зависимости от источника для возврата (в нашем рабочем процессе есть несколько мест, где можно сделать возврат), ItemNumber
для данного ReturnItem
может быть нулевым. В этом случае нам нужно полагаться на ReturnItem.OrderItemId
, чтобы сопоставить его с OrderItem
.
Я решил проблему с помощью LINQ, но для этого требуется вложенный цикл for (под капотом), поэтому я стараюсь избегать этого, если это возможно, в то же время сохраняя читабельность. Другими словами, я хочу избежать времени выполнения O (N ^ 2) и ищите O (N) или лучше, но опять же, сохраняя читабельность (я знаю, что здесь много чего спрашиваю, но я решил, что у меня будет творческое решение). Я создал решение, в котором у меня есть два словаря для элементов заказа. Один из них, ключ - это номер позиции, а другой ключ - идентификатор позиции заказа. Это работает и решает проблему производительности, но я полностью теряю удобочитаемость.
Вот оригинальное утверждение 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>
, чье количество для отдельного предмета больше, чем заказанное количество (т. Е. Они пытаются вернуть больше, чем они заказали в первую очередь).
Ура!