开发者

Using Linq to find the element after a specified element in a collection

开发者 https://www.devze.com 2023-02-04 14:15 出处:网络
I have an ordered list of People.I hav开发者_Python百科e a person that I know exists in that collection.How can I determine which person is next in the list?You could do something like this:

I have an ordered list of People. I hav开发者_Python百科e a person that I know exists in that collection. How can I determine which person is next in the list?


You could do something like this:

IEnumerable<Person> persons = ..

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

The idea is to produce a sequence resulting in skipping elements until you meet the condition, then take the second element of that sequence.

If there's no guarantee that the query will return a result (e.g. a match is never found, or is the last element of the sequence), you could replace ElementAt with ElementAtOrDefault, and then do a null-test to check for success / failure.

I notice you say in your question that you have an ordered list of people. If you could explain what that means in more detail, we might be able to provide a better answer (for example, we may not have to linear-search the sequence).


SkipWhile is a method that takes a predicate and skips everything until the predicate is false. It returns that element and everything after.

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();

where isThePerson is a method that takes a person and returns true if it is the person you are interested it.


You can use code like this:

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

This value gets == null if "/to" command line argument not given, non-null if path was provided.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号