Einfache Ienumerator Verwendung (mit Beispiel)
-
26-10-2019 - |
Frage
Ich habe Probleme, mich daran zu erinnern, wie (aber nicht warum) zu bedienen ist IEnumerator
s in C#. Ich bin es gewohnt, Java mit seiner wundervollen Dokumentation, die den Anfängern ziemlich gut erklärt. Also bitte, tragen Sie es mit mir.
Ich habe versucht, aus anderen Antworten auf diese Boards zu lernen, ohne Erfolg. Anstatt eine generische Frage zu stellen, die bereits zuvor gestellt wurde, habe ich ein bestimmtes Beispiel, das die Dinge für mich klären würde.
Angenommen, ich habe eine Methode, die übergeben werden muss IEnumerable<String>
Objekt. Die Methode muss nur die Buchstaben verkettet werden roxxors
bis zum Ende eines jeden String
im Iterator. Es wird dann diesen neuen Iterator zurückgeben (natürlich das Original IEnumerable
Objekt bleibt so wie es war).
Wie würde ich das vorgehen? Die Antwort hier sollte vielen bei grundlegenden Fragen zu diesen Objekten zusätzlich zu mir helfen.
Lösung
Hier ist die Dokumentation zu IEnumerator
. Sie werden verwendet, um die Werte von Listen zu erhalten, bei denen die Länge nicht unbedingt im Voraus bekannt ist (obwohl dies auch sein könnte). Das Wort kommt von enumerate
, was bedeutet, "nacheinander abzählen oder zu nennen".
IEnumerator
und IEnumerator<T>
wird von allen bereitgestellt IEnumerable
und IEnumerable<T>
Schnittstellen (letztere liefern beide) in .NET über GetEnumerator()
. Das ist wichtig, weil die foreach
Die Anweisung wurde entwickelt, um direkt mit Aufzählern über diese Schnittstellenmethoden zu arbeiten.
Also zum Beispiel:
IEnumerator enumerator = enumerable.GetEnumerator();
while (enumerator.MoveNext())
{
object item = enumerator.Current;
// Perform logic on the item
}
Wird:
foreach(object item in enumerable)
{
// Perform logic on the item
}
In Bezug auf Ihr spezifisches Szenario implementieren fast alle Sammlungen in .NET IEnumerable
. Aus diesem Grund können Sie Folgendes tun:
public IEnumerator Enumerate(IEnumerable enumerable)
{
// List implements IEnumerable, but could be any collection.
List<string> list = new List<string>();
foreach(string value in enumerable)
{
list.Add(value + "roxxors");
}
return list.GetEnumerator();
}
Andere Tipps
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";
}
}
Verwendung der Ertragskonstrukt, oder einfach
var newCollection = strings.Select(str => str + "roxxors"); //(*)
oder
var newCollection = from str in strings select str + "roxxors"; //(**)
wo die beiden verwenden Linq und (**)
ist nur syntaktischer Zucker für (*)
.
Wenn ich dich richtig verstehe, dann in C# die yield return
Compiler Magic ist alles, was Sie brauchen, denke ich.
z.B
IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
foreach(string item in sequence)
{
yield return item + "roxxors";
}
}
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 :)
Sie können auch die SELEQ -Methode von LINQ verwenden:
var source = new[] { "Line 1", "Line 2" };
var result = source.Select(s => s + " roxxors");
Lesen Sie hier mehr Aufzählbare Methode