Question

Je vais avoir du mal à se rappeler comment (mais pas pourquoi) à utiliser IEnumerators en C #. Je suis habitué à Java avec sa merveilleuse documentation qui explique tout pour les débutants tout à fait bien. Alors s'il vous plaît, ours avec moi.

J'ai essayé l'apprentissage d'autres réponses sur ces conseils en vain. Plutôt que de poser une question générique qui a déjà été posée, j'ai un exemple spécifique qui clarifierait les choses pour moi.

Supposons que j'ai un procédé qui doit être transmis un objet IEnumerable<String>. Toute la méthode doit faire est de concaténer les lettres roxxors à la fin de chaque String dans le iterator. Il retournera ensuite cette nouvelle iterator (bien sûr l'objet IEnumerable original est laissé tel quel).

Comment pourrais-je aller à ce sujet? La réponse ici devrait aider beaucoup de questions fondamentales au sujet de ces objets, en plus de moi, bien sûr.

Était-ce utile?

La solution

Voici la documentation sur IEnumerator . Ils sont utilisés pour obtenir les valeurs des listes, dont la longueur est pas nécessairement connu avant le temps (même si elle pourrait être). Le mot vient de enumerate, qui signifie « compterez ou un nom par un ».

IEnumerator et IEnumerator<T> est fourni par toutes les interfaces IEnumerable et IEnumerable<T> (ce dernier fournissant à la fois) dans .NET via GetEnumerator(). Ceci est important car l'instruction foreach est conçu pour travailler directement avec les agents recenseurs par ces méthodes d'interface.

Ainsi, par exemple:

IEnumerator enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())
{
    object item = enumerator.Current;
    // Perform logic on the item
}

Devient:

foreach(object item in enumerable)
{
    // Perform logic on the item
}

En ce qui concerne votre scénario spécifique, presque toutes les collections dans .NET mettre en œuvre IEnumerable. En raison de cela, vous pouvez faire ce qui suit:

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();
}

Autres conseils

public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  List<string> myList = new List<string>();
  foreach(string str in strings)
  {
      myList.Add(str + "roxxors");
  }
  return myList;
}

ou

public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  foreach(string str in strings)
  {
      yield return str + "roxxors";
  }
}

en utilisant le rendement construction , ou simplement

var newCollection = strings.Select(str => str + "roxxors"); //(*)

ou

var newCollection = from str in strings select str + "roxxors"; //(**)

où les deux derniers LINQ et (**) est juste du sucre syntaxique pour (*) .

Si je vous comprends bien, puis en c # la magie du compilateur yield return est tout ce que vous avez besoin, je pense.

par exemple.

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
    foreach(string item in sequence)
    {
         yield return item + "roxxors";
    }
}

Je ferais quelque chose comme:

private IEnumerable<string> DoWork(IEnumerable<string> data)
{
    List<string> newData = new List<string>();
    foreach(string item in data)
    {
        newData.Add(item + "roxxors");
    }
    return newData;
}

choses simples:)

Vous pouvez également utiliser Sélectionner la méthode de LINQ:

var source = new[] { "Line 1", "Line 2" };

var result = source.Select(s => s + " roxxors");

En savoir plus ici Enumerable.Select Procédé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top