Bagaimana saya bisa mengulang Daftar <T> dan mengambil setiap item?

176

Bagaimana saya bisa menelusuri Daftar dan mengambil setiap item?

Saya ingin hasilnya terlihat seperti ini:

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

Ini kode saya:

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

Jawaban:

274

foreach:

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

Tautan MSDN

Atau, karena itu adalah List<T>.. yang mengimplementasikan metode pengindeks [], Anda dapat menggunakan forloop normal juga .. meskipun kurang mudah dibaca (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
sumber
7
@awudoin Apa? Tidak itu tidak .. itu membuat referensi pada stack .. selain itu, tidak. A foreachtidak mengkloning objek ..
Simon Whitehead
2
Saya harus mengklarifikasi: Ini juga menciptakan Enumerator.. yang merupakan struct.. yang juga ada di tumpukan. Jadi saya masih belum mengerti apa yang Anda maksud dengan komentar Anda.
Simon Whitehead
7
Anda benar .... itu hanya Enumeratorsalinan dan bukan objek. Tetapi faktanya tetap, tergantung pada apa yang Anda lakukan, ada lebih banyak overhead dengan foreachloop vs. forloop. Saya baru saja menjalankan tes cepat dengan kode Anda dengan 100.000 entri di Listdan foreachloop memakan waktu dua kali lebih lama (sebenarnya 1,9 kali lebih lama). Ini tidak selalu benar dalam semua situasi, tetapi dalam banyak situasi. Itu tergantung pada ukuran Daftar, berapa banyak operasi yang Anda lakukan dalam lingkaran, dll .... Ini adalah apa yang saya maksudkan.
awudoin
36

Hanya untuk kelengkapan, ada juga cara LINQ / Lambda:

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

Sama seperti koleksi lainnya. Dengan tambahan List<T>.ForEachmetode.

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
sumber
6
Kata peringatan lain, jika Anda memiliki daftar besar, (sebagian besar maksud saya lebih dari 100.000 item) myMoney.Count mulai memakan waktu karena harus melintasi daftar untuk melakukan Count, dan dalam untuk contoh di atas myMoney. Hitungan dihitung setiap kali di sekitar loop. Jadi menggunakan int myMoneyC = myMoney.Count; untuk (int i = 0; i <myMoneyC; i ++) akan membuat loop ini berkali-kali lebih cepat.
SuperGSJ
12

Ini adalah bagaimana saya akan menulis menggunakan lebih banyak functional way. Ini kodenya:

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}");
});
Coder Absolute
sumber
2
Terima kasih. Ini cara yang sangat singkat untuk mencapai tugas ini. Anda juga telah menggunakan sintaks menulisLine yang baru dan ringkas yang diperkenalkan di VS 2017 / .NET 4.7.
Jauh