2017-10-17 6 views
2

これを自分自身で行う方法を解読しようとしましたが、LINQの使用についての理解はかなり制限されています。アイデアは、例えば、あなたがItemName「ニンジン」とGroceryオブジェクトを持つことができ、それは二つの異なるItemTypesに来ているオブジェクトのオブジェクトのプロパティのリストを使用した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、重量= 2lb、それぞれの量が異なります。もちろん、単にニンジンよりも多くの項目があるでしょう、これらはまた、リストに格納されています。私がやりたいのは何

List<Grocery> groceries; 

は、一定の重量を考えると、すべての食料品のため、すべての数量のリストを取得することです。例えば。私は、1ポンドのタイプを持つすべての項目について、このようにそれを行うことができます:私はこれがあるのか​​はわからないけれども、私が知りたいのですがどのような

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(); 

各食料品のための数量の一覧を取得するためには、あなたの質問に言及して、あなたはこのようなものを使用することができます

をあなたは資格を合計することができ

[ 
    { 
     "ItemName": "Grocery #1", 
     "Quantities": [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(); 

これは匿名オブジェクトのリストを作成しますが、それは(デモ用JSONで)次のようになりますあなたが実際に何をしているのかが分かっていれば、それは次のようになります。

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

あり、あなたが行うことができます他のもののトンだが、これは全体としてこれにアプローチする1つの方法をカバーする必要があります。

+0

あなたの最初の答えはまさに私が後にしたものでしたが、StriplingWarriorはあなたにそれを打つだけです。余分な編集もありがとう。 –

関連する問題