Làm cách nào tôi có thể lặp qua Danh sách <T> và lấy từng mục?


176

Làm thế nào tôi có thể lặp qua Danh sách và lấy từng mục?

Tôi muốn đầu ra trông như thế này:

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

Đây là mã của tôi:

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

Câu trả lời:


274

foreach:

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

Liên kết MSDN

Ngoài ra, vì đó là một List<T>.. thực hiện một phương thức lập chỉ mục [], bạn cũng có thể sử dụng một forvòng lặp bình thường .. mặc dù nó ít đọc hơn (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 Gì? Không, nó không .. nó tạo ra một tham chiếu trên stack .. ngoài ra, nó không. A foreachkhông nhân bản các vật thể ..
Simon Whitehead

2
Tôi nên làm rõ: Nó cũng tạo ra một Enumerator.. đó là một struct.. cũng nằm trên stack. Vì vậy, tôi vẫn không hoàn toàn nhận được những gì bạn đang nhận được với nhận xét của bạn.
Simon Whitehead

7
Bạn nói đúng .... nó chỉ là Enumeratormột bản sao của đối tượng. Nhưng thực tế vẫn còn, tùy thuộc vào những gì bạn đang làm có nhiều chi phí hơn với một foreachvòng lặp so với forvòng lặp. Tôi vừa chạy thử nghiệm nhanh với mã của bạn với 100.000 mục trong vòng lặp Listforeachvòng lặp mất gấp đôi thời gian (thực tế là 1,9 lần). Điều này không nhất thiết đúng trong mọi tình huống, nhưng trong nhiều trường hợp. Nó phụ thuộc vào kích thước của Danh sách, có bao nhiêu thao tác bạn thực hiện trong vòng lặp, v.v .... Đây là những gì tôi đang làm.
awudoin

36

Để hoàn thiện, cũng có cách LINQ / Lambda:

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

20

Cũng giống như bất kỳ bộ sưu tập khác. Với việc bổ sung các List<T>.ForEachphương pháp.

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
Một lời cảnh báo khác, nếu bạn có một danh sách lớn, (ý tôi là lớn hơn 100.000 mục) myMoney. Bắt đầu phải mất một thời gian vì nó phải duyệt qua danh sách để thực hiện Count và trong ví dụ trên myMoney. Đếm được tính mỗi lần xung quanh vòng lặp. Vì vậy, sử dụng int myMoneyC = myMoney.Count; for (int i = 0; i <myMoneyC; i ++) sẽ làm cho vòng lặp này nhanh hơn nhiều lần.
SuperGSJ

12

Đây là cách tôi sẽ viết bằng cách sử dụng nhiều hơn functional way. Đây là mã:

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
Cảm ơn. Đây là cách rất ngắn để đạt được nhiệm vụ này. Bạn cũng đã sử dụng cú pháp mới và nhỏ gọn của writeLine đã được giới thiệu trong VS 2017 / .NET 4.7.
Sâu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.