2017-02-23 16 views
0

LINQに変換したい次のスニペットがあります。目標は、内部コレクション内の一致を見つけて、そのDataプロパティを返すことです。助言がありますか?今matchesはすべて含まれていWhereLINQを使用してネストされたコレクション内の値を確認する

var matches = sections 
    .SelectMany(s => s.Fields) 
    .Where(f => f.Id == id) 
    .Select(f => f.Data); 

でそれflterその後、

sections.SelectMany(x => x.Fields).Where(field => field.Id == id).Select(field => field.Data).FirstOrDefault() 
+1

'Select'、' SelectMany'、 'FirstOrDefault()'(またはあなたの場合は 'LastOrDefault')です。 – Rob

答えて

3

あなたは、コレクションを平らにするSelectManyを使用することができます。

string data = null; 
    foreach (var section in sections) 
    { 
     foreach (var field in section.Fields) 
     { 
      if (field.Id == id) 
      { 
       data = field.Data; 
      } 
     } 
    } 
0

次のコードは、ロブさんのコメントに基づいて、働くだろう一致するデータ文字列。一致するものが1つのみの場合は、Single(またはある場合はSingleOrDefault)を使用して個別の値を取得することができます。より多くの一致がある場合は、FirstOrDefaultまたはLastOrDefaultを使用してください。 (あなたのコードでは、Lastはあなたに同じ答えを与える方法である)

あなたは一緒にすべてのことを入れて、簡素化することができます:あなたは何の一致がない

data = sections 
    .SelectMany(s => s.Fields) 
    .SingleOrDefault(f => f.Id == id) 
    ?.Data; 

?念のために。

関連する問題