在某个条目之后的有序列表中选择项目

本文关键字:列表 选择 项目 之后 | 更新日期: 2023-09-27 18:04:11

我有一个有序的对象列表。我可以通过使用以下代码轻松地在列表中找到一个项目:

purchaseOrders.FirstOrDefault(x => x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase))

我要做的是选择列表中出现在该条目之后的所有项目。如何才能最好地实现这一目标?是获取该项的索引并选择一个范围吗?

在某个条目之后的有序列表中选择项目

听起来你想要SkipWhile:

var orders = purchaseOrders.SkipWhile(x => !x.OurRef.Equals(...));

一旦迭代器停止跳过,它就不再为后面的条目计算谓词。

请注意,该代码将包含与谓词不匹配的条目,即具有给定引用的条目。它基本上会给你从那个顺序开始的所有条目。如果你想跳过它,你可以使用.Skip(1):
// Skip the exact match
var orders = purchaseOrders.SkipWhile(x => !x.OurRef.Equals(...)).Skip(1);

这将是线性的,请注意…如果列表是由x.OurRef排序的,你可以用二进制搜索找到索引,并从那里开始取范围……但我不会这么做,除非你发现更简单的代码会给你带来问题。

也许你应该看看LINQ的反向和TakeWhile方法的组合,如果我正确理解你的问题。

可能看起来像purchaseOrder.Reverse().TakeWhile(x => !x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase))

对不起,如果代码是未格式化的,我现在来自移动web。

也许你想要这样的东西:

int itemIndex = list.IndexOf(list.FirstOrDefault(x => x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase));
var newList = list.Where((f, i) => i >= itemIndex);