使用Linq在集合中的指定元素之后查找元素

时间:2011-01-11 02:36:48

标签: c# linq

我有一份有序的人员名单。我有一个我认识的人存在于该系列中。如何确定列表中的下一个人?

3 个答案:

答案 0 :(得分:29)

你可以这样做:

IEnumerable<Person> persons = ..

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

我们的想法是生成一个导致跳过元素的序列,直到满足条件,然后取那个序列的第二个元素。

如果无法保证查询将返回结果(例如,从未找到匹配项,或者是序列的最后一个元素),则可以将ElementAt替换为ElementAtOrDefault,然后执行null - 检查成功/失败的测试。

我注意到你在问题中说你有订购的人员名单。如果您能够更详细地解释这意味着什么,我们可能能够提供更好的答案(例如,我们可能不必对序列进行线性搜索)。

答案 1 :(得分:5)

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。

答案 2 :(得分:0)

您可以使用如下代码:

String toDir = Environment.GetCommandLineArgs().SkipWhile(x => x != "/to").Skip(1).Take(1).FirstOrDefault();

如果未提供== null命令行参数,则该值为"/to",如果提供了路径,则为non-null