2011-01-11 9 views

Antwort

24

Sie so etwas tun könnte:

IEnumerable<Person> persons = .. 

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

Die Idee ist, eine Sequenzelemente in Überspringen resultierende herzustellen, bis die Bedingung erfüllen, dann nehmen Sie das zweite Element von dass Sequenz.

Wenn es keine Garantie gibt, dass die Abfrage ein Ergebnis zurück (zB ein Spiel nie gefunden, oder ist das letzte Element der Sequenz), Sie ElementAt mit ElementAtOrDefault ersetzen könnten, und dann eine null -test zu überprüfen Erfolg/Misserfolg.

Ich bemerke, dass Sie in Ihrer Frage sagen, dass Sie eine bestellte Liste der Leute haben. Wenn Sie genauer erklären könnten, was das bedeutet, können wir vielleicht eine bessere Antwort geben (zum Beispiel müssen wir die Sequenz möglicherweise nicht linear durchsuchen).

+0

Schlag mich einfach dazu :-) – finnw

+0

@finnw: Wir haben sogar den gleichen Namen gewählt. Stellen Sie sich vor, wir hätten denselben Personennamen gewählt. :) – Ani

+0

Dies ist eine großartige Lösung für eine generische Linq-zu-Objekt-Abfrage, aber der 'SkipWhile'-Abfrageoperator wird in Linq to Sql nicht unterstützt. –

3

SkipWhile ist eine Methode, die ein Prädikat übernimmt und alles überspringt, bis das Prädikat falsch ist. Es gibt dieses Element und alles danach zurück.

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

wo isThePerson ist eine Methode, die eine Person nimmt und gibt true zurück, wenn es die Person, die Sie interessiert es sind.

+0

Es gibt 2 Probleme hier: 1) Es gibt eine redundante Aufzählung der * gesamten * Quellsequenz. 2) Es wird fehlschlagen, wenn 'restlichePersonen.Zahl() == 0 ', d.h. die Bedingung wird niemals erfüllt. – Ani

+0

1) Ich sehe nicht, wo es die gesamte Sequenz zweimal aufzählt. Kannst du darauf hinweisen wo? 2) Es wird fehlschlagen, wenn es nicht in der Liste ist, aber die Anforderungen sagen, die Person ist garantiert in der Liste, so ist es kein Problem. –

+1

Denken Sie daran, dass die meisten LINQ-Operatoren die verzögerte Ausführung verwenden. 'restlichePersonen' sind eine * Abfrage *, keine Liste oder ein Array. Die Ergebnisse werden zweimal abgerufen, einmal für 'Count()' und einmal für 'Skip (1) .First()'. – Ani

Verwandte Themen