У меня есть упорядоченный список людей. У меня есть человек, которого я знаю, существует в этой коллекции. Как определить, кто из перечисленных ниже?
Использование 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, если это тот, кого вас интересует.