Ich habe Probleme, mich daran zu erinnern, wie (aber nicht warum) IEnumerator
s in C # verwendet werden soll. Ich bin an Java mit seiner wunderbaren Dokumentation gewöhnt, die Anfängern alles sehr gut erklärt. Also bitte, ertrage es mit mir.
Ich habe erfolglos versucht, aus anderen Antworten auf diesen Boards zu lernen. Anstatt eine allgemeine Frage zu stellen, die bereits zuvor gestellt wurde, habe ich ein spezielles Beispiel, das die Dinge für mich klarstellen würde.
Angenommen, ich habe eine Methode, der ein IEnumerable<String>
Objekt übergeben werden muss. Alles, was die Methode tun muss, ist, die Buchstaben roxxors
an das Ende jedes einzelnen String
im Iterator zu verketten . Dieser neue Iterator wird dann zurückgegeben (natürlich IEnumerable
bleibt das ursprüngliche Objekt unverändert ).
Wie würde ich das machen? Die Antwort hier sollte natürlich neben mir vielen bei grundlegenden Fragen zu diesen Objekten helfen.
quelle
IEnumerator
ist schreibgeschützt,IEnumerable
kann jedoch normalerweise auf seinen veränderlichen Typ zurückgesetzt werden (z. B.((List<string>)foo.ReadOnlyValues).Add("Hahaha! So much for read only sucker!")
). Seien Sie also vorsichtig, wenn Sie davon ausgehen, dass diesIEnumerable
Sie davor schützt.public IEnumerable<string> Appender(IEnumerable<string> strings) { List<string> myList = new List<string>(); foreach(string str in strings) { myList.Add(str + "roxxors"); } return myList; }
oder
public IEnumerable<string> Appender(IEnumerable<string> strings) { foreach(string str in strings) { yield return str + "roxxors"; } }
unter Verwendung des Ertragskonstrukts oder einfach
var newCollection = strings.Select(str => str + "roxxors"); //(*)
oder
var newCollection = from str in strings select str + "roxxors"; //(**)
wo die beiden letzteren LINQ verwenden und
(**)
nur syntaktischer Zucker für sind(*)
.quelle
.Selectg(x=>x)
. B. ).Wenn ich dich richtig verstehe, dann ist in c # die
yield return
Compiler-Magie alles, was du brauchst, denke ich.z.B
IEnumerable<string> myMethod(IEnumerable<string> sequence) { foreach(string item in sequence) { yield return item + "roxxors"; } }
quelle
IEnumerable
Objekt zurückgegeben, das bei jedemMoveNext
Aufruf eine Zeichenfolge erstellt (entweder direkt oder indirekt mit foreach)Ich würde so etwas tun wie:
private IEnumerable<string> DoWork(IEnumerable<string> data) { List<string> newData = new List<string>(); foreach(string item in data) { newData.Add(item + "roxxors"); } return newData; }
Einfaches Zeug :)
quelle
List<T>
ist einIEnumerable<T>
. Aber ja, es gibt bessere Möglichkeiten, dies zu tun (mityield
).Sie können auch die Auswahlmethode von LINQ verwenden:
var source = new[] { "Line 1", "Line 2" }; var result = source.Select(s => s + " roxxors");
Lesen Sie hier mehr Enumerable.Select-Methode
quelle