List <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ループも使用できます。

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ないのクローンオブジェクト...
サイモン・ホワイトヘッド

2
明確にする必要Enumeratorがありstructます。それはまた、スタックにある..を作成します。だから私はまだあなたがあなたのコメントで得ていたものを完全に理解していません。
Simon Whitehead

7
その通りです...それは単なるEnumeratorオブジェクトのコピーであり、オブジェクトのコピーではありません。しかし、あなたが何をしているのかに応じて、foreachループとループではオーバーヘッドが大きくなりforます。100,000エントリのコードを使用して簡単なテストを実行したところListforeachループは2倍(実際には1.9倍)かかりました。これは必ずしもすべての状況に当てはまるわけではありませんが、多くの場合です。それは、リストのサイズ、ループ内で行う操作の数などによって異なります...これが私が得ていたものです。
awudoin 2013

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;を使用します。for(int i = 0; i <myMoneyC; i ++)は、このループを何倍も速くします。
SuperGSJ 2017年

12

これは、私がmoreを使用して書く方法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の新しくコンパクトな構文を使用しました。
ディープ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.