如果我有一个IEnumerable<Foo> allFoos
和一个IEnumerable<Int32> bestFooIndexes
,我如何才能得到一个新的IEnumerable<Foo> bestFoos
,其中包含Foo
中的allFoos
条目,这些条目位于bestFooIndexes
指定的索引处?
最佳答案
以利沙的回答当然行得通,但可能效率很低…这取决于实现allFoos
的是什么。如果它是IList<T>
的一个实现,ElementAt
将是有效的,但是如果它实际上是linq to objects查询的结果,那么查询将为每个索引重新运行。因此,更有效的方法是:
var allFoosList = allFoos.ToList();
// Given that we *know* allFoosList is a list, we can just use the indexer
// rather than getting ElementAt to perform the optimization on each iteration
var bestFoos = bestFooIndexes.Select(index => allFoosList[index]);
当然,只有在需要的时候你才能这样做:
IList<Foo> allFoosList = allFoos as IList<Foo> ?? allFoos.ToList();
var bestFoos = bestFooIndexes.Select(index => allFoosList[index]);