2017-04-24 66 views
0

c#中是否存在linq函數,它使您可以從特定範圍的索引中收集IEnumerables?從列表中收集索引

一個例子是

 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

如果原始數據源是已經被指數接近,如列表或數組,你可以使用indexArray.Select馬特顯示。

如果你有一個IEnumerable<T>來代替,你可以使用Where重載,它提供了索引和值。所以:

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

現在我已經看到了這個,我記得使用它。它並沒有粘在我的腦海裏,因爲我不理解它。現在更清楚了,謝謝。 –

8

只需使用SelectindexArray並通過索引從objectArray回報的項目。

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

注意這非常有效地對任何集合,它允許索引(例如,ArrayList<T>)。在更一般的情況下,您可能無法直接索引IEnumerableICollection。在這種情況下,你需要看到Jon的答案。根據所涉及列表的大小以及需要查找的項目數量,可能需要先將IEnumerable轉換爲ArrayList(例如使用ToArray)。

+0

看起來不錯,謝謝。 也感謝您的快速回復 - 看起來是一個有用的社區。 –

+3

當然,我正在大舉推崇:) –