Utilisation simple IEnumerator (par exemple)
-
26-10-2019 - |
Question
Je vais avoir du mal à se rappeler comment (mais pas pourquoi) à utiliser IEnumerator
s 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.
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é