Como posso percorrer uma Lista <T> e pegar cada item?

176

Como posso percorrer uma lista e pegar cada item?

Quero que a saída fique assim:

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

Aqui está o meu 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; }
}
user1929393
fonte

Respostas:

274

foreach:

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

Link MSDN

Como alternativa, por ser um List<T>.. que implementa um método indexador [], você também pode usar um forloop normal .. embora seja menos legível (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
fonte
7
@awudoin What? Não, ele não cria uma referência na pilha. Fora isso, não cria. A foreachnão clona os objetos ..
Simon Whitehead
2
Devo esclarecer: Ele também cria um Enumerator.. que é um struct.. que também está na pilha. Então, eu ainda não entendi o que você estava conseguindo com seu comentário.
precisa saber é o seguinte
7
Você está certo ... é apenas uma Enumeratore não uma cópia do objeto. Mas o fato é que, dependendo do que você está fazendo, há mais sobrecarga com um foreachloop vs. um forloop. Acabei de executar um teste rápido com seu código com 100.000 entradas no loop Liste o foreachloop demorou o dobro do tempo (na verdade, 1,9 vezes o comprimento). Isso não é necessariamente verdade em todas as situações, mas em muitas. Depende do tamanho da lista, quantas operações você faz dentro do loop, etc ... Era isso que eu estava fazendo.
awudoin 19/09/2013
36

Apenas para completar, há também a maneira LINQ / Lambda:

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

Assim como qualquer outra coleção. Com a adição do 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));
Khan
fonte
6
Outra palavra de aviso, se você tiver uma grande lista, (em grande parte, quero dizer mais de 100.000 itens), myMoney.Count começa a demorar um pouco, pois precisa percorrer a lista para executar o Count, e nos exemplos acima do myMoney. A contagem é contada toda vez no loop. Então, usando int myMoneyC = myMoney.Count; for (int i = 0; i <myMoneyC; i ++) tornará esse loop muitas vezes mais rápido.
precisa saber é o seguinte
12

É assim que eu escreveria usando mais functional way. Aqui está o 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}");
});
Código absoluto
fonte
2
Obrigado. Essa é uma maneira muito curta de realizar essa tarefa. Você também usou a sintaxe nova e compacta do writeLine que foi introduzida no VS 2017 / .NET 4.7.
Profundo