好的,所以我试图获取所有已装运的物品,如果装运物品不在该列表中,则将它们添加到列表中。但是如果在列表中找到了装运项目,那么我想将这两个项目组合在一起。
以下是我正在使用的代码:
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());
}
任何人都能指出我在正确的轨道上。
干杯
答案 0 :(得分:1)
感谢您的澄清。从本质上讲,我理解您的问题的方式是您需要获取按Shipment分组的对象图,并从Item的角度查看它。 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();