2017-08-08 5 views
1

以下のコードを使用して、 "5VOH"で始まるリストの最初の項目を取得できます。特定のもので始まるリストの2番目の項目を取得するLINQ構文を探します

list.FirstOrDefault(s => s.StartsWith("5VOH")); 

どのように私は2番目または3番目を得ることができますか?私は使用しようとしました...

list.Skip(1).FirstOrDefault(s => s.StartsWith("5VOH")); 

しかし、それは動作していません。それはまだ最初のものをつかんでいます。

ありがとうございました。

+1

リストの最初の項目も「5VOH」で始まっていれば、期待どおりの動作が得られます。 –

答えて

8

フィルタに一致するかどうかにかかわらず、最初の項目をスキップしています。代わりにフィルタをかけ、1をスキップしてから最初のものを取るか、2番目の一致がない場合はデフォルトを取ります。

var results = list.Where(s => s.StartsWith("5VOH")).Skip(1).FirstOrDefault(); 
+0

答えと説明をありがとう。完璧。 – JimDel

2

スキップ(1)を使用して1をスキップします。

list.Where(s => s.StartsWith("5VOH")).Skip(1).FirstOrDefaoult(); 
-1

N番目の要素を取得する関数を書くことができます。

ここでNは0から始まりますが、好きなようにすることができます。

public static string FindNthItem(List<string> list, string search, int n) 
    { 
     var results = list.Where(x => x.StartsWith(search)).ToList(); 
     if (n > results.Count || n < 0) 
      return null; 
     else 
      return results[n]; 
    } 
+1

'n 'を結果の中の項目の数と比較する必要があります。そうしないと、' ElementAt'を使用して例外を得ることができます。 'result'に複数のパスを避けるには' return list.Where(x => x.StartsWith(search))。Skip(n).FirstOrDefault(); ''を実行するとよいでしょう。 'n 'も0未満です。 – juharr

+0

実際、私は 'list.Count'ではなく、' results.Count'と言っていました。私の間違いです。 – Sach

+0

'results'は' IEnumerable 'なので、' Count() 'を使うか、' Where'の後ろに 'ToList'を投げれば結果は' List 'になり、二重反復は避けられます。 'ElementAt(n)'の代わりに 'results [n]'を使うこともできます。 – juharr

関連する問題