Come posso scorrere un elenco <T> e afferrare ogni elemento?


176

Come posso scorrere un elenco e afferrare ogni elemento?

Voglio che l'output assomigli a questo:

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

Ecco il mio codice:

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

Risposte:


274

foreach:

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

Collegamento MSDN

In alternativa, poiché è un List<T>.. che implementa un metodo indicizzatore [], puoi usare anche un forciclo normale .. sebbene sia meno leggibile (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 Cosa? No, non ... crea un riferimento sullo stack ... a parte questo, non lo fa. A foreachnon clona gli oggetti ..
Simon Whitehead,

2
Dovrei chiarire: crea anche un Enumerator.. che è un struct.. che è anche in pila. Quindi non riesco ancora a capire cosa stavi facendo con il tuo commento.
Simon Whitehead,

7
Hai ragione .... è solo una Enumeratore non una copia dell'oggetto. Ma il fatto rimane, a seconda di ciò che stai facendo, c'è più sovraccarico con un foreachciclo contro un forciclo. Ho appena eseguito un test rapido con il tuo codice con 100.000 voci nel Liste il foreachciclo ha richiesto il doppio del tempo (in realtà 1,9 volte il tempo). Questo non è necessariamente vero in tutte le situazioni, ma in molte. Dipende dalle dimensioni dell'elenco, dal numero di operazioni eseguite all'interno del ciclo, ecc. Questo era ciò a cui stavo arrivando.
Awudoin,

36

Solo per completezza, esiste anche il modo LINQ / Lambda:

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

20

Proprio come qualsiasi altra collezione. Con l'aggiunta del List<T>.ForEachmetodo.

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
Un'altra parola di avvertimento, se hai una grande lista, (intendo più di 100.000 articoli) myMoney.Count inizia a prendere un po 'di tempo perché deve attraversare la lista per eseguire il Count, e negli esempi sopra myMoney. Il conteggio viene conteggiato ogni volta intorno al ciclo. Quindi usando int myMoneyC = myMoney.Count; per (int i = 0; i <myMoneyC; i ++) renderà questo ciclo molte volte più veloce.
SuperGSJ

12

Ecco come scriverò usando di più functional way. Ecco il codice:

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
Grazie. Questo è un modo molto breve per raggiungere questo obiettivo. Hai anche usato la sintassi nuova e compatta di writeLine che è stata introdotta in VS 2017 / .NET 4.7.
Deep
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.