c# - 是否有更有效的 LINQ 语句来反向搜索 List<T> 中的条件?

标签 c# linq list

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

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

但是,要使用 LINQ,我们知道的唯一方法是获取“limit”项的现有索引,这很昂贵,然后在整个源集合上运行带索引的 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> ),这将迭代列表的一部分恰好一次。

关于c# - 是否有更有效的 LINQ 语句来反向搜索 List<T> 中的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164310/

相关文章:

C# 和 MongoDB 使用 ObjectId 列表删除记录

c# - 为什么我无法访问我的对象模型的属性?

c# - 处理 : both fields equal or both null or empty 的 linq 函数

C# 将泛型列表传递给方法,然后转换为类型

list - BST-最小方案

Python 设置查找效率

c# - 在专用服务器上的 IIS 7 上运行 .net webservice 时出错

c# - 从数据表中删除包含空值的行

c# - 在测试资源管理器 C# 上未发现 Specflow 测试

c# - 如何将文件路径数组分成几个较小的数组?