Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用对象的对象列表属性进行LINQ查询_C#_Linq - Fatal编程技术网

C# 使用对象的对象列表属性进行LINQ查询

C# 使用对象的对象列表属性进行LINQ查询,c#,linq,C#,Linq,我自己也试图解释如何做到这一点,但我对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

我自己也试图解释如何做到这一点,但我对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; }
}
我想做的是得到一份清单,列出所有杂货的数量,给定一定的重量。例如,对于具有1lb类型的所有项目,我可以这样做:

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);
        }
    }
}
清单数量=新清单();
foreach(杂货店中的杂货店)
{
foreach(杂货店中的ItemType ItemType.ItemType)
{
如果(itemType.Weight==1)
{
数量。添加(itemType.Quantity);
}
}
}

我想知道的是如何使用LINQ表达式实现相同的结果,尽管我不确定这是否可能,而不返回到使用
.ForEach
,并简单地执行与上述代码相同的操作,但以一种不太冗长(因此可读性较差)的方式。感谢您的帮助。

选择Many是您的朋友:

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

正如雷诺所说,
SelectMany
是一条出路。但与其使用
ForEach
填充列表,不如一直使用LINQ:

List<long> quantities = groceries.SelectMany(g => g.ItemTypes)
    .Where(t => t.Weight == 1)
    .Select(t => t.Quantity)
    .ToList();
List quanties=杂货。选择many(g=>g.ItemTypes)
.式中(t=>t.重量==1)
.选择(t=>t.数量)
.ToList();

您可以使用。为了复制您的
foreach
处理,您可以使用以下方法:

List<long> quantities = groceries.SelectMany(x => x.ItemTypes)
    .Where(x => x.Weight == 1)
    .Select(x => x.Quantity)
    .ToList();
这将创建一个匿名对象列表,如下所示(在JSON中演示):

[
{
“项目名称”:“杂货店#1”,
“数量”:[1,2,3]
},
...
]
你可以把数量加起来,如果这是你真正想要的。看起来是这样的:

var groceryQuantities = groceries.Select(g => new
{
    g.ItemName,
    Quantities = g.ItemTypes
        .Where(it => it.Weight == 1)
        .Select(it => it.Quantity)
        .ToList()
}).ToList();
var groceryQuantities = groceries.Select(g => new
{
    g.ItemName,
    TotalQuantity = g.ItemTypes
        .Where(it => it.Weight == 1)
        .Sum(it => it.Quantity)
}).ToList();
你还可以做很多其他的事情,但这应该包括一种方法来解决这个问题

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