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; }
}

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);
}

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));

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));

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}");
});

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.