2017-10-03 7 views
0

좋아, 배송 된 모든 상품을 가져 와서 배송 상품이 목록에없는 경우 목록에 추가하려고합니다. 그러나 배송 물품이 목록에있는 경우 목록에있는 두 품목을 결합하고 싶습니다. 여기 nopcommerce 배송 상품 목록에서 집계 방법을 사용하는 C#

내가 함께 일하고 있어요 코드입니다 :이 두 변수의

var shippedItems = _orderService.GetOrderById(shipment.OrderId).Shipments.Where(x => x.ShippedDateUtc != null && x.OrderId == shipment.OrderId && x.Id != shipment.Id).ToList(); 

     List<ShipmentItem> shipmentItemsList = new List<ShipmentItem>(); 

     for (int i = 0; i <= shippedItems.Count - 1; i++) 
     { 
      var si = shippedItems[i]; 

      var sii = si.ShipmentItems.ToList(); 

      foreach (var item in sii) 
      { 
       if (!shipmentItemsList.Contains(item)) 
       { 
        shipmentItemsList.Add(item); 
       } 
       else 
       { 
        var foundId = shipmentItemsList.Select(x => x.Id == item.Id); 
        shipmentItemsList.Aggregate((foundId, item) => foundId + item); 
       } 
      } 
     } 

(foundId, item) 내가 오류를 얻을 :

the variable name라는 이름의 지역 변수는이 때문에 범위에 선언 할 수 없습니다

이름은 둘러싼 로컬 범위에서 로컬 또는 매개 변수를 정의하는 데 사용됩니다.

UPDATE 다음을 시도해 볼 수 있다고 생각했지만 결과에 합류하지 않았습니다.

if (i == 0) 
{ 
    shipmentItemsList = si.ShipmentItems.ToList(); 
} 
else 
{ 
    shipmentItemsList.Concat(si.ShipmentItems.ToList()); 
} 

누구나 올바른 길을 가르쳐 줄 수 있습니다.

환호

+1

이유를 당신이 컴파일러 오류가 있어요 foundId 때문에 당신이 그것을 사용하려고 시도하는 위의 라인에 선언되었습니다. 그러나 더 큰 문제는 Aggregate 함수를 사용하여 Id (int maybe?)와 ShipmentItem을 결합하고 Aggregate가 동일한 유형의 인수에서 작동하는 것입니다. 또한 유형에 대한 사용자 정의 추가 연산자를 정의하지 않았 음을 추측합니다. 잠시 후 "else"를 치기를 원할 때 데이터가 어떻게 보이는지, 완료되면 어떻게 보이는지 이야기 해 봅시다. 거기에서 우리는 코드를 말할 수 있습니다. –

+0

@KyleBurns 도움을 주셔서 감사합니다. :) 그래, 맞아. 기본적으로 주문이 들어 오면 많은 품목을 가질 수 있지만 모든 품목은 한 배송에 배송되지 않을 수 있습니다. 따라서 여러 번 발송해야합니다. 그래서 각 품목을 반복 할 수 있도록 모든 선적 품목을 가져오고 싶지만 한 품목이 두 개의 shippments (하나의 수량 2, 다른 수량 3)를 통해 운송 된 경우 항목이 분리되어 하나의 항목이됩니다 5 양. 이것에 대한 새로운 지식의 종류는 그것에 대해 어떻게 가야할지 모르겠다 : / –

답변

1

감사합니다. 본질적으로, 내가 당신의 문제를 이해하는 방법은 당신이 선적에 의해 그룹화 된 객체 맵을 가져와 대신 아이템의 포인트에서보아야한다는 것입니다. Linq는 SelectMany를 사용하여 목록을 병합하고 GroupBy를 사용하여 병합 된 목록을 새 그룹으로 형성함으로써이 문제를 처리 할 수 ​​있습니다. 나는 nopCommerce 개체에 대한 속성 이름에 대한 몇 가지 가정을했습니다,하지만, 다음 코드 샘플에서는 올바른 속성 이름으로 조정할 충분히 가까이해야합니다

var shipmentItemsList = shippedItems // This is logically grouped by shipment id 
    .SelectMany(s => s.ShipmentItems) // First flatten the list 
    .GroupBy(i => i.ItemId) // Now group it by item id 
    .Select(g => new 
    { 
     ItemId = g.Key, 
     Quantity = g.Sum(item => item.Quantity) 
    }) // now get the quantity for each group 
    .ToList();