Использование Linq для поиска элемента после указанного элемента в коллекции

У меня есть упорядоченный список людей. У меня есть человек, которого я знаю, существует в этой коллекции. Как определить, кто из перечисленных ниже?

Ответ 1

Вы можете сделать что-то вроде этого:

IEnumerable<Person> persons = ..

var firstPersonAfterJack = persons.SkipWhile(p => p.Name != "Jack")
                                  .ElementAt(1); //Zero-indexed, means second

Идея состоит в том, чтобы создать последовательность, приводящую к пропусканию элементов, пока вы не встретите условие, а затем возьмите второй элемент этой последовательности.

Если нет гарантии, что запрос вернет результат (например, совпадение никогда не будет найдено или будет последним элементом последовательности), вы можете заменить ElementAt на ElementAtOrDefault, а затем сделать null -test, чтобы проверить успех/неудачу.

Я замечаю, что вы говорите в своем вопросе, что у вас есть упорядоченный список людей. Если бы вы могли объяснить, что это означает более подробно, мы могли бы обеспечить лучший ответ (например, нам может не потребоваться линейный поиск последовательности).

Ответ 2

SkipWhile - это метод, который берет предикат и пропускает все, пока предикат не станет ложным. Он возвращает этот элемент и все после.

var remainingPeople = collectionOfPeople.SkipWhile(p => !isThePerson(p));
if (remainingPeople.Count() == 1)
{
    // the person was the last in the list.
}
var nextPerson = remainingPeople.Skip(1).First();

где isThePerson - это метод, который берет человека и возвращает true, если это тот, кого вас интересует.