在某个条目之后的有序列表中选择项目
本文关键字:列表 选择 项目 之后 | 更新日期: 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);