LINQ - ist SkipWhile kaputt?
Ich bin ein bisschen überrascht, zu finden, die Ergebnisse des folgenden code, wo ich einfach nur entfernen möchten alle 3s aus einer Sequenz von int-Werten:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); //Oh noes! Returns { 1, 1, 2, 3 }
Warum nicht 3 übersprungen?
Mein Nächster Gedanke war, OK, der operator "Außer" wird den trick tun:
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.Except(i => i == 3); //Oh noes! Returns { 1, 2 }
In der Zusammenfassung,
- Entfernt, außer die 3, sondern auch
entfernt nicht verschiedene Elemente. Grr. - SkipWhile nicht überspringen Sie die letzten
element, selbst wenn es stimmt mit dem
Zustand. Grr.
Kann mir jemand erklären, warum SkipWhile nicht überspringen, das Letzte element? Und kann jemand empfehlen, was LINQ-Betreiber kann ich verwenden, um entfernen Sie die '3' von der Sequenz oben?
- Denke, dass es als SkipWhile(true). also, deine erste Bedingung (i==3) schlägt fehl. so, es wird SkipWhile(false) und so was passiert als Nächstes ? Es kehrt alle Elemente noch!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht gebrochen.
SkipWhile
nur überspringen von Objekten in der Anfang desIEnumerable<T>
. Sobald diese Bedingung nicht erfüllt, wird es gerne nehmen, den rest der Elemente. Andere Elemente, die später passen Sie es unten auf der Straße nicht ausgelassen werden.{3,1,2,3}
. Das gewünschte Ergebnis heraus zu filtern, alle 3s, wasWhere
ist für.Die SkipWhile und TakeWhile Operatoren überspringen oder die return-Elemente aus einer Sequenz, während eine Prädikat-Funktion geht (gibt True zurück). Das erste element, das nicht passieren das Prädikat die Funktion beendet den Prozess der evaluation.
//Umgeht Elemente in einer Sequenz, solange eine angegebene Bedingung wahr ist und liefert die verbleibenden Elemente.
Einer Lösung, die Sie nützlich finden können, ist mit Liste "FindAll" - Funktion.
Ahmad bereits Ihre Frage beantwortet, aber hier ist eine andere option: