[英]LINQ query using list of objects property of an object
我嘗試自己解釋如何執行此操作,但是我對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
“胡蘿卜”,並有兩種不同的ItemTypes
,例如當重量= 1磅和其中重量= 2磅,用不同數量的每個。 顯然,除了胡蘿卜以外,還有更多的項目,這些項目也存儲在列表中:
List<Grocery> groceries;
我想做的是得到一定重量的所有雜貨的所有數量的清單。 例如,對於所有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);
}
}
}
我想知道的是我如何使用LINQ表達式獲得相同的結果,盡管我不確定是否可以不使用.ForEach
並簡單地與上面的代碼做同樣的事情而又不那么冗長(因此可讀性較差)。 感謝您的幫助。
正如Reno所說, SelectMany
是必經之路。 但是不要使用ForEach
來填充列表,而要一直使用LINQ:
List<long> quantities = groceries.SelectMany(g => g.ItemTypes)
.Where(t => t.Weight == 1)
.Select(t => t.Quantity)
.ToList();
您可以使用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();
您還可以做很多其他事情,但這應該涵蓋一種整體解決方案。
SelectMany是您的朋友:
groceries.SelectMany(g => g.ItemTypes).Where(t => t.Weight == 1).ToList().ForEach(t => quantities.Add(t.Quantity));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.