5

我们正在尝试针对List<T>从该列表的末尾向后搜索条件的 LINQ 语句编写一个 LINQ 语句,但该语句在指定的“T”项处停止。

例如,如果列表有 1000 个项目并且“限制”项目位于位置 995(索引 994),那么我们只想搜索最后六个项目的测试条件。我们需要它尽可能地高性能。

但是,要使用 LINQ,我们知道的唯一方法是获取“限制”项的现有索引,这很昂贵,然后在整个源集合上运行带有索引的 Select,这也很昂贵,就像这样......

// 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?

4

1 回答 1

6

你不需要这些。

sourceList.Reverse()
          .TakeWhile(o => o != limitItem)
          .FirstOrDefault(o => ...);

由于延迟执行(并假设为sourceListimplements IList<T>),这将仅对列表的一部分进行一次迭代。

于 2013-10-03T16:26:35.820 回答