2017-04-24 11 views
0

特定の範囲のインデックスからIEnumerableを収集するためのlinq関数はC#にありますか?リストからインデックスを収集する

例では、元のデータソースは、そのようなリストや配列については、すでにインデックスでアクセス可能である場合にマットがあったとして、あなただけindexArray.Select使用することができます

 var objectArray = new string[] { "Bill", "Bob", "Joe", "Phil", "Tom", "Paul" }; 
     var indexArray = new int[] { 1, 3, 5 }; 

     var list = objectArray.Where(SOME_FUNCTION_TO_GET_INDEXES ??).ToList(); 

     //output would be list: 
     //Bob 
     //Phil 
     //Paul 
+2

私は、「ランダムな範囲」では、実際には「配列などの他の場所から取得した特定のセット」を意味すると答えました。わかりやすくするために質問を編集することをお勧めします。 –

+0

*インデックスを反復することなく、つまりインデックスを繰り返しますか?もちろん、あなたは 'indexArray'を反復する必要があります –

+0

私は彼らが反復できないという意味ではありませんでした。 –

答えて

7

だろう。

代わりにIEnumerable<T>がある場合は、Whereオーバーロードを使用してインデックスと値を提供できます。だから、:

var list = objectArray.Where((value, index) => indexArray.Contains(index)) 
         .ToList(); 
+1

これをもう一度見たので、私はそれを覚えています。私はそれを理解していなかったので、それは私の心に残っていませんでした。ありがとうございます。 –

8

はちょうどあなたのindexArraySelectを使用してインデックスを経由してobjectArrayからアイテムを返します。

var list = indexArray.Select(i => objectArray[i]); 

これは、インデックス(例えば、ArrayList<T>)を可能にする任意のコレクションのために非常に効率的に動作することに注意してください。 IEnumerableまたはICollectionというより一般的な場合は、直接インデックスに登録することはできません。その場合、ジョンの答えを見る必要があります。関係するリストのサイズや検索するアイテムの数に応じて、IEnumerableArrayまたはList(たとえば、ToArrayを使用)に変換する価値があります。

+0

すごくいいですね、ありがとう。 クイック返信をお寄せいただきありがとうございます - 有益なコミュニティと思われます。 –

+3

もちろん、私は大いにoverthinkingしていた:) –

関連する問題