簡體   English   中英

LINQ查詢使用對象的對象列表屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM