LINQ查询使用对象属性列表的对象

3
我尝试自己解密如何做到这一点,但我对LINQ的使用理解有限。我有两个类,如下所示:
public class Grocery
{
    public string ItemName { get; set; }
    public List<ItemType> ItemTypes { get; set; }
}

public class ItemType
{
    public double Weight { get; set; }
    public long Quantity { get; set; }
}

这个想法是你可以有一个名为“Grocery”的对象,它有一个名为“ItemName”的属性,比如是“Carrots”,而这个属性有两种不同的“ItemTypes”,例如其中一个重量为1磅,另一个重量为2磅,每个重量下面都有不同的数量。显然,除了胡萝卜之外还会有很多其他物品,它们也被存储在一个列表中:
List<Grocery> groceries;

我想做的是,根据一定的重量,获取所有杂货的数量清单。例如,对于所有具有1磅种类的物品,我可以像这样做:
List<long> quantities = new List<long>();

foreach (Grocery grocery in groceries)
{
    foreach (ItemType itemType in grocery.ItemTypes)
    {
        if (itemType.Weight == 1)
        {
            quantities.Add(itemType.Quantity);
        }
    }
}

我想知道如何使用LINQ表达式实现相同的结果,虽然我不确定是否可以避免使用.ForEach并以不那么冗长(因此不太可读)的方式执行与上面代码相同的操作。感谢您的帮助。
3个回答

4

正如Reno所说,SelectMany是正确的方法。但是不要使用ForEach来填充列表,完全采用LINQ:

List<long> quantities = groceries.SelectMany(g => g.ItemTypes)
    .Where(t => t.Weight == 1)
    .Select(t => t.Quantity)
    .ToList();

3
你可以使用SelectMany来实现这一点。为了复制你的foreach处理,你可以使用以下代码:
List<long> quantities = groceries.SelectMany(x => x.ItemTypes)
    .Where(x => x.Weight == 1)
    .Select(x => x.Quantity)
    .ToList();

为了获取每个杂货店的数量列表,就像你在问题中提到的那样,可以使用类似以下的代码:
var groceryQuantities = groceries.Select(g => new
{
    g.ItemName,
    Quantities = g.ItemTypes
        .Where(it => it.Weight == 1)
        .Select(it => it.Quantity)
        .ToList()
}).ToList();

这将创建一个匿名对象列表,大致如下(以JSON形式作为演示):
[
    {
        "ItemName": "Grocery #1",
        "Quantities": [1, 2, 3]
    },
    ...
]

如果你确实需要计算数量,你可以将它们相加。代码如下:

var groceryQuantities = groceries.Select(g => new
{
    g.ItemName,
    TotalQuantity = g.ItemTypes
        .Where(it => it.Weight == 1)
        .Sum(it => it.Quantity)
}).ToList();

还有很多其他的事情可以做,但是这应该涵盖了一种整体的方法。


1

SelectMany 是你的好朋友:

 groceries.SelectMany(g => g.ItemTypes).Where(t => t.Weight == 1).ToList().ForEach(t => quantities.Add(t.Quantity));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接