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

时间:2015-07-23 14:39:51

标签: c# linq

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

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

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

3 个答案:

答案 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);