2017-10-17 145 views
2

我試圖破譯如何做到這一點,但我對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 { get; set; } 
} 

的想法是,你可以有ItemName「胡蘿蔔」一個Grocery對象,並有兩種不同的ItemTypes,例如其中重量= 1磅,重量= 2磅,每個數量不同。顯然將會有更多的項目不僅僅是胡蘿蔔,這些被存儲在一個列表也:

List<Grocery> groceries; 

我想要做的就是讓所有的數量爲所有雜貨清單,賦予一定的權重。例如。我可以做這樣對於有一磅類型的所有項目:

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

由於裏諾說,SelectMany是要走的路。但是,而不是使用ForEach來填充列表,請LINQ一路:

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

完美的答案,謝謝你。 –

0

是的SelectMany您的朋友:

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

很好的答案謝謝,但由StriplingWarrior給出的語法更有用一些。感謝「SelectMany」的介紹。 –

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] 
    }, 
    ... 
] 

您能不能總結的QUA實際上,如果這就是你實際上的事情。這將是這樣的:

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

還有其他事情可以做一噸,但是這應該包括解決這個作爲一個整體的一種方式。

+0

你最初的回答正是我以前的想法,但是StriplingWarrior只是打敗你。感謝您的額外編輯。 –

相關問題