List <T>를 반복하고 각 항목을 잡을 수 있습니까?


176

List를 반복하고 각 항목을 가져 오는 방법은 무엇입니까?

출력이 다음과 같이 보이기를 원합니다.

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루프도 사용할 수 있습니다 . 비록 덜 읽기 쉬운 (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
큰 목록이있는 경우 또 다른 경고 단어 (큰 10 만 개가 넘는 항목을 의미합니다) myMoney.Count는 Count를 수행하기 위해 목록을 통과해야하기 때문에 시간이 걸리기 시작합니다. 예를 들어 myMoney 위의 예입니다. 루프를 돌 때마다 카운트가 카운트됩니다. 따라서 int myMoneyC = myMoney.Count; for (int i = 0; i <myMoneyC; i ++)는이 루프를 여러 번 빠르게 만듭니다.
SuperGSJ 2016 년

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
감사. 이 작업을 수행하는 매우 짧은 방법입니다. VS 2017 / .NET 4.7에 도입 된 새롭고 간단한 writeLine 구문도 사용했습니다.
Deep
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.