2009-08-26 1 views
14

У меня есть список объектов, которые все имеют свойство IDНайти следующую запись в наборе: LINQ

Eg

1, 10, 25, 30, 4

У меня есть currentId и Мне нужно, чтобы найти следующий Id в списке

Так Id тока пример установлен на 25, мне нужно, чтобы вернуть объект с идентификатором 30. один после того, как это было бы 4.

Как я делаю это элегантно в LINQ?

EDIT

Список упорядочен по свойству "сортировки". Таким образом, вы не можете просто заказать по id, так как это испортит заказ.

+0

Если вы хотите получить только один объект, чтобы не изменять порядок запроса? –

ответ

33

без повторного заказа (обратите внимание, я редактирую немного, как я думаю, что я неправильно понял вопрос):

int[] data = {1, 10, 25, 30, 4}; 
int last = 25; 
var next = data.SkipWhile(i => i != last).Skip(1).First(); 

Очевидно, что если data был набор предметов, что-то вроде:

var next = data.SkipWhile(obj => obj.Id != last).Skip(1).First(); 
+0

Кроме того, если это дошло до конца списка и попыталось пропустить, то оно выкинет исключение или просто вернет null. Нужно ли мне проверять это? – qui

+2

, поскольку он будет бросать, но вместо этого вы могли бы использовать 'FirstOrDefault', который не будет бросать. –

3
int currentId = 25; 
var next = yourCollection.Where(i => i.Id > currentId).OrderBy(i => i.Id).First(); 
+0

Повлиял бы порядок, извините, - отредактировал вопрос, чтобы очистить его. – qui

2

Существует довольно много решений. Я предлагаю что-то вроде следующего.

var next = items 
    .Where(item => item.Id > currentId) 
    .OrderBy(item => item.Id) 
    .First(); 

var next = items 
    .OrderBy(item => item.Id) 
    .First(item => item.Id > currentId); 

Если вы хотите, чтобы идентификаторы в порядке их появления в коллекции, вы можете использовать следующее.

var next = items 
    .SkipWhile(item => item.Id != currentId) 
    .Skip(1) 
    .FirstOrDefault(); 

Если это возвращает null, вы пытались получить следующий пункт последнего пункта.

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