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