Comment puis-je parcourir une liste <T> et saisir chaque élément?

176

Comment puis-je parcourir une liste et saisir chaque élément?

Je veux que la sortie ressemble à ceci:

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

Voici mon code:

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
la source

Réponses:

274

foreach:

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

Lien MSDN

Alternativement, comme il s'agit d'un List<T>.. qui implémente une méthode d'indexation [], vous pouvez également utiliser une forboucle normale .. bien qu'elle soit moins lisible (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
la source
7
@awudoin Quoi? Non, ce n'est pas le cas ... cela crée une référence sur la pile. A foreachne clone pas les objets ..
Simon Whitehead
2
Je devrais clarifier: cela crée également un Enumerator.. qui est un struct.. qui est également sur la pile. Je ne comprends donc toujours pas exactement ce que vous vouliez dire avec votre commentaire.
Simon Whitehead
7
Vous avez raison ... c'est juste une Enumeratorcopie et non une copie de l'objet. Mais le fait demeure, selon ce que vous faites, il y a plus de surcharge avec une foreachboucle qu'avec une forboucle. Je viens de lancer un test rapide avec votre code avec 100000 entrées dans le Listet la foreachboucle a pris deux fois plus de temps (en fait 1,9 fois plus longtemps). Ce n'est pas nécessairement vrai dans toutes les situations, mais dans beaucoup. Cela dépend de la taille de la liste, du nombre d'opérations que vous effectuez dans la boucle, etc. C'est ce à quoi je voulais en venir.
awudoin
36

Pour être complet, il existe également la méthode LINQ / Lambda:

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

Comme toute autre collection. Avec l'ajout de la List<T>.ForEachméthode.

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
la source
6
Un autre mot d'avertissement, si vous avez une grande liste, (par gros, je veux dire plus de 100000 éléments) myMoney.Count commence à prendre un certain temps car il doit parcourir la liste pour effectuer le décompte, et dans les exemples ci-dessus myMoney. Le compte est compté à chaque fois dans la boucle. Donc, en utilisant int myMoneyC = myMoney.Count; for (int i = 0; i <myMoneyC; i ++) rendra cette boucle plusieurs fois plus rapide.
SuperGSJ
12

C'est ainsi que j'écrirais en utilisant plus functional way. Voici le code:

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}");
});
Codeur absolu
la source
2
Merci. C'est un moyen très court pour accomplir cette tâche. Vous avez également utilisé la nouvelle syntaxe compacte de writeLine qui a été introduite dans VS 2017 / .NET 4.7.
profond