getenumerator - ienumerator c#
Uso simple de IEnumerator(con ejemplo) (5)
Aquí está la documentación en IEnumerator
. Se utilizan para obtener los valores de las listas, donde la longitud no se conoce necesariamente por adelantado (aunque podría ser). La palabra proviene de enumerate
, que significa "contar o nombrar uno por uno".
IEnumerator
e IEnumerator<T>
son proporcionados por todas las IEnumerable
e IEnumerable<T>
(esta última proporciona ambas) en .NET a través de GetEnumerator()
. Esto es importante porque la declaración foreach
está diseñada para trabajar directamente con los enumeradores a través de esos métodos de interfaz.
Así por ejemplo:
IEnumerator enumerator = enumerable.GetEnumerator();
while (enumerator.MoveNext())
{
object item = enumerator.Current;
// Perform logic on the item
}
Se convierte en:
foreach(object item in enumerable)
{
// Perform logic on the item
}
En cuanto a su escenario específico, casi todas las colecciones en .NET implementan IEnumerable
. Por eso, puedes hacer lo siguiente:
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();
}
Tengo problemas para recordar cómo (pero no por qué) usar IEnumerator
en C #. Estoy acostumbrado a Java con su maravillosa documentación que explica todo a los principiantes bastante bien. Entonces, por favor, tengan paciencia conmigo.
He intentado aprender de otras respuestas en estas tablas sin ningún resultado. En lugar de hacer una pregunta genérica que ya se haya formulado antes, tengo un ejemplo específico que me aclararía las cosas.
Supongamos que tengo un método que necesita pasar un objeto IEnumerable<String>
. Todo lo que se necesita hacer es concatenar las letras roxxors
al final de cada String
en el iterador. Luego devolverá este nuevo iterador (por supuesto, el objeto IEnumerable
original se deja como estaba).
¿Cómo voy a hacer esto? La respuesta aquí debería ayudar a muchos con preguntas básicas sobre estos objetos además de mí, por supuesto.
Haría algo como:
private IEnumerable<string> DoWork(IEnumerable<string> data)
{
List<string> newData = new List<string>();
foreach(string item in data)
{
newData.Add(item + "roxxors");
}
return newData;
}
Cosas simples :)
Si te entiendo correctamente, entonces en c # la magia del compilador de yield return
es todo lo que necesitas, creo.
p.ej
IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
foreach(string item in sequence)
{
yield return item + "roxxors";
}
}
También puedes usar el Método de selección LINQ:
var source = new[] { "Line 1", "Line 2" };
var result = source.Select(s => s + " roxxors");
Lea más aquí Enumerable.Select Method
public IEnumerable<string> Appender(IEnumerable<string> strings)
{
List<string> myList = new List<string>();
foreach(string str in strings)
{
myList.Add(str + "roxxors");
}
return myList;
}
o
public IEnumerable<string> Appender(IEnumerable<string> strings)
{
foreach(string str in strings)
{
yield return str + "roxxors";
}
}
usando la construcción de rendimiento , o simplemente
var newCollection = strings.Select(str => str + "roxxors"); //(*)
o
var newCollection = from str in strings select str + "roxxors"; //(**)
donde los dos últimos usan LINQ y (**)
es solo azúcar sintáctico para (*)
.