如何遍历List <T>并抓住每个项目?


181

如何遍历列表并抓住每个项目?

我希望输出看起来像这样:

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

Answers:


282

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什么?不,它不会..它会在堆栈上创建一个引用..除此之外,它不会。一个foreach不克隆的对象..
西蒙·怀特黑德

2
我应该澄清一下:它还创建一个Enumerator..,它也是一个struct也在堆栈上的..。所以我仍然不太满意您的评论。
西蒙·怀特海德2013年

8
您是对的...。它只是Enumerator该对象的,而不是该对象的副本。但是事实仍然存在,取决于您在做什么,foreach循环与循环相比会产生更多的开销for。我只是跑了一个快速测试你的代码在10万项Listforeach循环了两倍的时间(实际1.9倍长)。并非在所有情况下都如此,但在许多情况下都是如此。这取决于List的大小,您在循环中执行了多少操作,等等。
awudoin

37

出于完整性考虑,还有LINQ / Lambda方法:

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

这要干净得多
jet_choong

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开始需要一段时间,因为它必须遍历列表才能执行Count,例如在myMoney上面的示例中。每次循环时都会计数。因此,使用int myMoneyC = myMoney.Count; for(int i = 0; i <myMoneyC; i ++)将使此循环快很多倍。
SuperGSJ

13

这就是我使用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语法。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.