2017-04-24 59 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

当然,我正在大举推崇:) –