web-dev-qa-db-fra.com

Utilisation simple d'IEnumerator (avec exemple)

Je ne parviens pas à me rappeler comment (mais pas pourquoi) utiliser IEnumerators en C #. Je suis habitué à Java avec sa merveilleuse documentation qui explique très bien tout aux débutants. Alors, je vous en prie, soyez patient.

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

Supposons que j'ai une méthode qui doit être passée à un IEnumerable<String> objet. Tout ce que la méthode doit faire est de concaténer les lettres roxxors à la fin de chaque String de l’itérateur. Il retournera ensuite ce nouvel itérateur (bien entendu, l’objet original IEnumerable restera tel quel).

Comment pourrais-je m'y prendre? La réponse ici devrait aider beaucoup de personnes avec des questions de base sur ces objets en plus de moi, bien sûr.

66
BlackVegetable

Voici la documentation sur IEnumerator . Ils sont utilisés pour obtenir les valeurs de listes, dont la longueur n’est pas nécessairement connue à l’avance (même s’il pourrait l’être). Le mot vient de enumerate, ce qui signifie "compter ou nommer un par un".

IEnumerator et IEnumerator<T> sont fournis par toutes les interfaces IEnumerable et IEnumerable<T> (cette dernière fournissant les deux) dans .NET via GetEnumerator(). Cela est important car l'instruction foreach est conçue pour fonctionner directement avec les énumérateurs via ces méthodes d'interface.

Donc 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 de .NET implémentent IEnumerable. À cause 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();
}
96
Paul Walls
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 construction de rendement , ou simplement

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

ou

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

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

18
Rune

Si je vous comprends bien alors en c # le yield return La magie du compilateur est tout ce dont vous avez besoin, je pense.

par exemple.

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

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

Trucs simples :)

5
Mike

Vous pouvez aussi utiliser la méthode de sélection de LINQ:

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

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

Lire la suite ici Méthode Enumerable.Select

4
Slava Kovalchuk