我有一个有序的对象列表。我可以使用以下代码轻松找到列表中的项目:
purchaseOrders.FirstOrDefault(x => x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase))
我想要做的是选择此条目后出现的列表中的所有项目。如何最好地实现这一目标?是获取此项目的索引并选择范围吗?
答案 0 :(得分:6)
听起来你想要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
排序的,你可以找到带二进制搜索的索引并从那里开始取范围...但我不会这样做除非您发现更简单的代码会导致问题。
答案 1 :(得分:2)
如果我能正确理解你的问题,你可能应该看看LINQ的Reverse和TakeWhile方法的组合。
可能看起来像purchaseOrder.Reverse().TakeWhile(x => !x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase))
。
很抱歉,如果代码未格式化,我现在就来自移动网络。
答案 2 :(得分:0)
可能你想要这样的东西:
int itemIndex = list.IndexOf(list.FirstOrDefault(x => x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase));
var newList = list.Where((f, i) => i >= itemIndex);