¿Cómo puedo recorrer una Lista <T> y tomar cada elemento?

176

¿Cómo puedo recorrer una lista y tomar cada elemento?

Quiero que la salida se vea así:

Console.WriteLine("amount is {0}, and type is {1}", myMoney.amount, myMoney.type);

Aquí está mi código:

static void Main(string[] args)
{
    List<Money> myMoney = new List<Money> 
    {
        new Money{amount = 10, type = "US"},
        new Money{amount = 20, type = "US"}
    };
}

class Money
{
    public int amount { get; set; }
    public string type { get; set; }
}
usuario1929393
fuente

Respuestas:

274

foreach:

foreach (var money in myMoney) {
    Console.WriteLine("Amount is {0} and type is {1}", money.amount, money.type);
}

Enlace MSDN

Alternativamente, debido a que es un List<T>... que implementa un método indexador [], también puede usar un forbucle normal ... aunque es menos legible (IMO):

for (var i = 0; i < myMoney.Count; i++) {
    Console.WriteLine("Amount is {0} and type is {1}", myMoney[i].amount, myMoney[i].type);
}
Simon Whitehead
fuente
77
@awudoin ¿Qué? No, no lo hace ... crea una referencia en la pila ... aparte de eso, no lo hace. A foreachno clona los objetos ..
Simon Whitehead
2
Debo aclarar: también crea un Enumerator... que es un struct... que también está en la pila. Así que todavía no entiendo a qué te referías con tu comentario.
Simon Whitehead
77
Tienes razón ... es solo una Enumeratory no una copia del objeto. Pero el hecho es que, dependiendo de lo que esté haciendo, hay más sobrecarga con un foreachbucle frente a un forbucle. Acabo de ejecutar una prueba rápida con su código con 100,000 entradas en Listy el foreachciclo tomó el doble de tiempo (en realidad 1,9 veces más). Esto no es necesariamente cierto en todas las situaciones, pero en muchas. Depende del tamaño de la Lista, cuántas operaciones realiza dentro del bucle, etc. Esto era a lo que me refería.
awudoin
36

Solo para completar, también existe la forma LINQ / Lambda:

myMoney.ForEach((theMoney) => Console.WriteLine("amount is {0}, and type is {1}", theMoney.amount, theMoney.type));
acarlon
fuente
20

Como cualquier otra colección. Con la adición del List<T>.ForEachmétodo.

foreach (var item in myMoney)
    Console.WriteLine("amount is {0}, and type is {1}", item.amount, item.type);

for (int i = 0; i < myMoney.Count; i++)
    Console.WriteLine("amount is {0}, and type is {1}", myMoney[i].amount, myMoney[i].type);

myMoney.ForEach(item => Console.WriteLine("amount is {0}, and type is {1}", item.amount, item.type));
Kan
fuente
66
Otra palabra de advertencia, si tiene una lista grande, (en general me refiero a más de 100,000 artículos) myMoney.Count comienza a tomar un tiempo, ya que tiene que recorrer la lista para realizar el Conteo, y en los ejemplos anteriores a myMoney. El recuento se cuenta cada vez alrededor del ciclo. Entonces, usando int myMoneyC = myMoney.Count; for (int i = 0; i <myMoneyC; i ++) hará que este bucle sea muchas veces más rápido.
SuperGSJ
12

Así es como escribiría usando más functional way. Aquí está el código:

new List<Money>()
{
     new Money() { Amount = 10, Type = "US"},
     new Money() { Amount = 20, Type = "US"}
}
.ForEach(money =>
{
    Console.WriteLine($"amount is {money.Amount}, and type is {money.Type}");
});
Codificador absoluto
fuente
2
Gracias. Este es un camino muy corto para lograr esta tarea. También ha utilizado la nueva y compacta sintaxis de writeLine que se introdujo en VS 2017 / .NET 4.7.
Profundo