如果我有一个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]);

09-26 03:40