Je ne parviens pas à me rappeler comment (mais pas pourquoi) utiliser IEnumerator
s 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.
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();
}
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 (*)
.
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";
}
}
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 :)
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