Ich habe eine geordnete Liste von Personen. Ich habe eine Person, von der ich weiß, dass sie in dieser Sammlung existiert. Wie kann ich feststellen, welche Person als nächstes in der Liste ist?Verwenden von Linq, um das Element nach einem angegebenen Element in einer Sammlung zu finden
Antwort
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).
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.
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
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. –
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
- 1. Finden Sie das Element vor und nach einem bestimmten Element
- 2. Wie wird ein Element in Laravel-Auflistung nach einem Element mit einem angegebenen Schlüssel eingefügt?
- 3. Um die Sammlung zu ändern, während Element zu IEnumarable Sammlung
- 4. Wie finde ich Xpath nach Element Text in Selenide, um das Element zu verwenden?
- 5. Das fehlende Element in einem Array finden
- 6. Programm, um das letzte Element in der Liste zu finden?
- 7. Wie finden Sie das erste Element nach einer bestimmten Reihenfolge mit LINQ in O (n)?
- 8. Effizienter Algorithmus, um Master-Element in einem Array zu finden?
- 9. Fehlerlisten, um Trennung von einem Element zu verwenden, es
- 10. Verwenden von event.target, um Element
- 11. Verwenden von querySelector(), um das letzte td-Element zu erhalten
- 12. das vorherige Element in einer JQuery-Array zu finden
- 13. Finden Sie das zweithöchste Element
- 14. LINQ verwenden, den Minimalwert einer Postens Eigenschaft, in einer Sammlung finden, in einem Wörterbuch
- 15. Hinzufügen von CheckBoxList-Element in StringBuilder Verwenden Sie zu Linq
- 16. Finden Element in einem Array, die nicht
- 17. Fehler: "Das Element mit dem angegebenen Namen wurde nicht gefunden."
- 18. Appium android - Element nach Attribut finden
- 19. Wie kann ich das erste Element nach einem Element mit LINQ-to-XML erhalten?
- 20. Linq, um eine Sammlung mit Werten aus einer anderen Sammlung zu aktualisieren?
- 21. Debuggen von LINQ pro Element
- 22. Verwenden von LINQ, um alle Schlüssel aus einer Sammlung zu finden, die sich nicht in einer anderen befinden?
- 23. Xpath nächstgelegenen Element zu einem bestimmten Element
- 24. Um das kleinste Element in einem Array zu finden, die sortiert und gedrehter
- 25. Verwenden Element von CSS zu überprüfen, ob Element in Protractor
- 26. Effektive Möglichkeiten, ein Element in einem Javascript-Array zu finden
- 27. Capybara: Element in page.all Knoten zu finden
- 28. HQL: Ist ein Element einer Sammlung in einer anderen Sammlung?
- 29. Regex, um das letzte Element nach dem Leerzeichen zu erhalten
- 30. jQuery: Element nach einem anderen Element hinzufügen
Schlag mich einfach dazu :-) – finnw
@finnw: Wir haben sogar den gleichen Namen gewählt. Stellen Sie sich vor, wir hätten denselben Personennamen gewählt. :) – Ani
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. –