我们正在尝试针对List<T>
编写LINQ语句,该语句从该列表的末尾向后搜索条件,但是在指定的“T”项处停止。
例如,如果列表中有1000个项目且“限制”项目位于995(索引994),那么我们只想搜索最后六个项目的测试条件。我们需要尽可能保持高性能。
然而,要使用LINQ,我们知道的唯一方法是获取'limit'项的现有索引,这是昂贵的,然后在整个源集合上运行Select with index,这也很昂贵,就像这样...
// Assume limitItem is of type Foo and sourceList is of type List<Foo>
var limitIndex = sourceList.IndexOf(limitItem);
var sourceListWithIndex = sourceList.Select( (Foo, Index) => new { Foo, Index } );
var fooWithIndex = sourceListWithIndex
.LastOrDefault(item =>
(item.Foo.SomTestValue == true)
&&
(item.Index >= limitIndex) );
那么是否有一种更简单的方法可以告诉Linq“如果你已经检查了这个项目就停止枚举”,或者我是否必须在基于索引的循环中自己手动执行它而根本不使用LINQ?
答案 0 :(得分:5)
你不需要任何这些。
sourceList.Reverse()
.TakeWhile(o => o != limitItem)
.FirstOrDefault(o => ...);
感谢延迟执行(假设sourceList
实现了IList<T>
),这将完全迭代部分列表一次。