Ich denke darüber nach, IEnumerable für meine benutzerdefinierte Sammlung (einen Baum) zu implementieren, damit ich foreach verwenden kann, um meinen Baum zu durchlaufen. Soweit ich weiß, beginnt foreach jedoch immer mit dem ersten Element der Sammlung. Ich möchte auswählen, aus welchem Element jeder beginnt. Ist es möglich, das Element, von dem foreach ausgeht, irgendwie zu ändern?
c#
iterator
ienumerable
Inferno
quelle
quelle
Antworten:
Ja. Mach Folgendes:
Skip
ist eine IEnumerable-Funktion, die alle angegebenen Werte überspringt, beginnend mit dem aktuellen Index. Wenn Sie jedoch nur die ersten drei verwenden möchten, würden Sie Folgendes verwenden.Take
:Diese können sogar miteinander gepaart werden. Wenn Sie also nur die 4-6 Elemente möchten, können Sie Folgendes tun:
quelle
foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }
vsfor(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
Es ist am einfachsten, die
Skip
Methode in LINQ to Objects zu verwenden, um eine bestimmte Anzahl von Elementen zu überspringen:Ändern Sie einfach 1 für einen anderen Wert, um eine andere Anzahl von Elementen zu überspringen ...
Ebenso können Sie
Take
die Anzahl der zurückgegebenen Elemente begrenzen.Sie können mehr über diese beiden lesen (und die damit verbundene
SkipWhile
undTakeWhile
Methoden) in meiner Edulinq Blog - Serie .quelle
sequence
dies legitim sein kannnull
oder nicht. Vermutlich kann das OP das selbst erledigen - das ist nicht wirklich Teil der Frage ...Mit Enumerable.Skip können Sie einige Elemente überspringen und dort starten.
Beispielsweise:
Wenn Sie jedoch einen Baum schreiben, möchten Sie möglicherweise ein Mitglied für das Baumelement selbst bereitstellen, das ein neues
IEnumerable<T>
zurückgibt, das von dort unten aufgelistet wird. Dies wäre möglicherweise auf lange Sicht nützlicher.quelle
IEnumerable<T> SubTree(rootIndex)
? Guter Anruf!IEnumerable<MyTreeElement> Children
Sie könnten also einfach Folgendes tun:foreach(var item in someElement.Children)
- viel klarer als die Verwendung von IMO-Erweiterungsmethoden.Foreach
wird Ihre Sammlung in der durch Ihre Implementierung von definierten Weise durchlaufenIEnumerable
. Obwohl Sie Elemente überspringen können (wie oben vorgeschlagen), durchlaufen Sie die Elemente technisch immer noch in derselben Reihenfolge.Sie sind sich nicht sicher, was Sie erreichen möchten, aber Ihre Klasse kann mehrere
IEnumerable
Eigenschaften haben, von denen jede die Elemente in einer bestimmten Reihenfolge auflistet.quelle
Wenn Sie das Lesen von Zeilen in a überspringen möchten
DataGridView
, versuchen Sie diesWenn Sie den Inhalt einer
DataGridView
Zeile in eine andere überspringen möchten , versuchen Sie Folgendes:Dadurch wird der Inhalt von einer
DataGridView
zur anderen kopiert , wobei 3 Zeilen übersprungen werden.quelle
DataGridView
(oder sogar ein UI-Framework).