【发布时间】:2020-03-30 13:06:18
【问题描述】:
我正在尝试对列表的某些列表对象执行 Linq GroupBy。
public class ItemDto
{
public int ItemId { get; set; }
public string ProductName { get; set; }
public int Count { get; set; }
public List<CondimentDto> Condiments { get; set; }
}
public class CondimentDto
{
public CondimentDto(int ItemId, string productName, decimal originalPrice)
{
ItemId = ItemId;
ProductName = productName;
OriginalPrice = originalPrice;
}
public int PosItemId { get; set; }
public string ProductName { get; set; }
public decimal OriginalPrice { get; set; }
}
这里是列表示例。
var items = new List<ItemDto>();
items.Add(new ItemDto(){ItemId = 1, ProductName = "Steak", Condiments = new List<CondimentDto>{new CondimentDto(11, "Mayonez", 1)}});
items.Add(new ItemDto() { ItemId = 1, ProductName = "Steak", Condiments = new List<CondimentDto> { new CondimentDto(11, "Mayonez", 1) } });
items.Add(new ItemDto() { ItemId = 1, ProductName = "Steak", Condiments = new List<CondimentDto> { new CondimentDto(11, "Hardal", 1) } });
这是我的 LinQ 查询;
var result = items.GroupBy(item => new {item.ItemId, item.Condiments})
.Select(x=>new ItemDto
{
ItemId = x.Key,
ProductName = x.First().ProductName,
Condiments = x.First().Condiments,
Count = x.Count()
})
.ToList();
我想要做的是我想按 ItemId 和 List of Condiments 对我的列表进行分组。我期望的结果是
{
items[
{
"ItemId": 1,
"ProductName": "Steak",
"Condiments": [
{
"ItemId": 11,
"Name": "Mayonez",
"Price": 1
}
],
"Count": 2
},
{
"ItemId": 1,
"ProductName": "Steak",
"Condiments": [
{
"ItemId": 11,
"Name": "Hardal",
"Price": 1
}
],
"Count": 1
}
]
}
因此,有两个相同的列表项,这就是为什么它必须被分组并且计数为 2。而另一个不同的项目是调味品是 Hardal。它是独立的,计数为 1。
一个列表对象可以分成两组吗?顺便说一句,调味品可以是空的。然后它应该只按 ID 分组。
谢谢
【问题讨论】:
-
如果一件商品有不止一种调味品会怎样?它是否应该只与具有相同调味品的物品组合在一起?如果只有一个,您可以使用
item.Condiments?.FirstOrDefault()进行分组(注意将空列表和空列表组合在一起)。 -
是的,调味品不止一种。在这种情况下,其他项目调味品也必须不止一种调味品,否则它们将彼此不同。它应该包括相同的调味品。它应该和我数不完的一样。
-
我想先按 ItemId 分组,然后比较 Condimets List 但我做不到