ฉันจะวนลูปผ่านรายการ <T> แล้วหยิบแต่ละรายการได้อย่างไร


176

ฉันจะวนซ้ำรายการและคว้าแต่ละรายการได้อย่างไร

ฉันต้องการให้ผลลัพธ์เป็นดังนี้:

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

นี่คือรหัสของฉัน:

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

คำตอบ:


274

foreach:

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

ลิงก์ MSDN

อีกวิธีหนึ่งเพราะมันเป็นList<T>.. ซึ่งใช้วิธีการทำดัชนี[]คุณสามารถใช้forวงปกติได้เช่นกัน .. ถึงแม้ว่ามันจะเป็น readble (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 อะไร ไม่ไม่ .. สร้างการอ้างอิงในสแต็ก .. นอกเหนือจากนั้นไม่ได้ A foreachจะไม่ลอกแบบวัตถุ ..
Simon Whitehead

2
ฉันควรชี้แจง: มันยังสร้างEnumerator.. ซึ่งก็คือstruct.. ซึ่งก็คือในกอง ดังนั้นฉันยังไม่ได้รับสิ่งที่คุณได้รับกับความคิดเห็นของคุณ
Simon Whitehead

7
คุณพูดถูก .... มันเป็นเพียงEnumeratorและไม่ใช่สำเนาของวัตถุ แต่ความจริงก็ยังคงขึ้นอยู่กับสิ่งที่คุณทำมีค่าใช้จ่ายมากกว่ากับforeachห่วงกับforวง ฉันเพิ่งรันการทดสอบอย่างรวดเร็วด้วยโค้ดของคุณที่มี 100,000 รายการในListและforeachวนรอบใช้เวลานานเป็นสองเท่า (จริง ๆ แล้ว 1.9 เท่า) สิ่งนี้ไม่จำเป็นต้องเป็นจริงในทุกสถานการณ์ แต่ในหลาย ๆ กรณี ขึ้นอยู่กับขนาดของรายการจำนวนการดำเนินการที่คุณทำภายในลูป ฯลฯ ... นี่คือสิ่งที่ฉันได้รับ
awudoin

36

เพื่อความสมบูรณ์นอกจากนี้ยังมีวิธี LINQ / Lambda:

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

20

เช่นเดียวกับคอลเลกชันอื่น ๆ ด้วยการเพิ่มList<T>.ForEachวิธีการ

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
อีกคำเตือนถ้าคุณมีรายการใหญ่ (โดยใหญ่ฉันหมายถึงมากกว่า 100,000 รายการ) myMoney.Count เริ่มใช้เวลาสักครู่เพราะมันต้องสำรวจรายการเพื่อดำเนินการนับและในตัวอย่างข้างต้น myMoney การนับจะถูกนับทุกรอบวง ดังนั้นการใช้ int myMoneyC = myMoney.Count; สำหรับ (int i = 0; i <myMoneyC; i ++) จะทำให้การวนซ้ำนี้เร็วขึ้นหลายเท่า
SuperGSJ

12

functional wayนี่คือวิธีที่ผมจะเขียนโดยใช้มากขึ้น นี่คือรหัส:

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
ขอบคุณ นี่เป็นวิธีที่สั้นมากในการบรรลุภารกิจนี้ คุณยังใช้ไวยากรณ์ใหม่และขนาดกะทัดรัดของ writeLine ที่นำมาใช้ใน VS 2017 / .NET 4.7
Deep
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.