2015-07-23 14 views
3

У меня есть упорядоченный список объектов. Я могу легко найти элемент в списке, используя следующий код:Выбор элементов в упорядоченном списке после определенной записи

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

То, что я хочу сделать, это выбрать все элементы в списке, которые появляются после данной записи. Как лучше всего это достичь? Было бы, чтобы получить индекс этого элемента и выбрать диапазон?

ответ

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 можно найти индекс с бинарным поиском и взять диапазон от там и далее ... но я бы этого не сделал, если не обнаружил, что более простой код вызывает проблемы.

2

Возможно, вам стоит взглянуть на комбинацию LINQ в методах Reverse и TakeWhile, если я правильно понимаю ваш вопрос.

Это может быть purchaseOrder.Reverse().TakeWhile(x => !x.OurRef.Equals(lastPurchaseOrder, StringComparison.OrdinalIgnoreCase)).

Извините, если код неформатирован, я из мобильной сети прямо сейчас.

+2

Я не думаю, что 'TakeWhile' имеет смысл, но если вы думаете, это пожалуйста, положить пример того, как OP может использовать его. – juharr

+0

@juharr 'purchaseOrder.Reverse(). TakeWhile (x =>! X.OurRef.Equals (lastPurchaseOrder, StringComparison.OrdinalIgnoreCase))' возвратит объекты, которые были после входа из-за обратного порядка источника. (Извините за неформатированный, сейчас я на мобильном сайте.) –

+0

Вы должны добавить это к ответу и просто убедиться, что заказ совпадает с оригиналом, добавьте еще один «Обратный» в конец. – juharr

0

Может быть, вы хотите что-то вроде этого:

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

'Where' имеет перегрузку, которая включает индекс в предикат. https://msdn.microsoft.com/en-us/library/vstudio/bb549418(v=vs.100).aspx – juharr

+0

@juharr спасибо, я обновил свой ответ – Fabjan

 Смежные вопросы

  • Нет связанных вопросов^_^