Frage

Ich habe Probleme, mich daran zu erinnern, wie (aber nicht warum) zu bedienen ist IEnumerators 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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top