List <T> listesinde nasıl dolaşabilir ve her öğeyi nasıl alabilirim?


176

Listede nasıl dolaşabilir ve her öğeyi nasıl alabilirim?

Çıktının şöyle görünmesini istiyorum:

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

İşte benim kod:

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

Yanıtlar:


274

foreach:

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

MSDN Bağlantısı

Alternatif olarak, List<T>bir indeksleyici yöntemi uygulayan bir .. olduğu []için, normal fordöngü de kullanabilirsiniz .. daha az okunabilir olmasına rağmen (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 Ne? Hayır öyle değil. Yığında bir referans oluşturur .. bunun dışında değil. A foreachnesneleri
klonlamıyor

2
Açıklığa kavuşturmalıyım: Aynı zamanda yığın üzerinde bulunan Enumeratorbir struct.. oluşturur. Bu yüzden hala yorumunuzla ne elde ettiğinizi tam olarak anlamıyorum.
Simon Whitehead

7
Haklısın ... bu sadece Enumeratornesnenin bir kopyası değil. Ama gerçek şu ki, ne yaptığınıza bağlı olarak bir foreachdöngü ile bir döngü arasında daha fazla yük var for. Kodunuzda 100.000 giriş ile hızlı bir test yaptım Listve foreachdöngü iki kat uzun sürdü (aslında 1.9 kat daha uzun). Bu her durumda mutlaka doğru değildir, ancak çoğu durumda. Listenin büyüklüğüne, döngü içinde kaç işlem yaptığınıza vb. Bağlıdır.
awudoin

36

Sadece tamlık için, LINQ / Lambda yolu da vardır:

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

20

Diğer tüm koleksiyonlar gibi. List<T>.ForEachYöntemin eklenmesi ile .

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
Başka bir uyarı kelimesi, büyük bir listeniz varsa, (büyük olarak 100.000'den fazla öğeyi kastediyorum) myMoney.Count, Sayımı gerçekleştirmek için listeyi geçmesi gerektiği için ve myMoney'nin üstündeki örneklerde biraz zaman almaya başlar. Sayı, döngü etrafında her seferinde sayılır. Yani int myMoneyC = myMoney.Count kullanarak; (int i = 0; i <myMoneyC; i ++) bu döngüyü çok daha hızlı hale getirir.
SuperGSJ

12

Ben daha fazlasını kullanarak böyle yazardım functional way. İşte kod:

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
Teşekkürler. Bu görevi yerine getirmenin çok kısa bir yolu. VS 2017 / .NET 4.7'de tanıtılan writeLine'ın yeni ve kompakt sözdizimini de kullandınız.
Derin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.