我们正在尝试针对List<T>编写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?

最佳答案

您不需要任何。

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

多亏了延迟执行(并假设sourceList实现IList<T>),这将使列表的一部分仅重复一次。

10-07 12:33