C#:在foreach中使用Take()是声明可以使用吗?

时间:2017-06-16 09:50:02

标签: c# linq foreach ienumerable ienumerator

有人可以建议我们应该使用以下两行代码吗?

foreach(var items in itemList.Take(20))
{

}

var itemList = itemList.Take(20);

foreach(var items in itemList)
{

}

以上两行在优化代码方面是否有任何区别,如果是,请告诉我原因。

3 个答案:

答案 0 :(得分:5)

不,这两段代码不会表现不同。

事实上,如果你看看这个SharpLab example,你会注意到这两段代码编译成完全相同的IL。

所以:

  • 代码看起来不同,如果对重要,请选择您觉得最舒服的
  • 代码将编译完全相同的输出(在发布版本中),在这种情况下代码的外观(在这种情况下)与代码的行为或性能

简而言之,选择您认为最佳的版本。

答案 1 :(得分:0)

foreach仅在in个关键字后评估该方法一次。一个非常简单的例子ConsoleApplication

public class Test
{
    public IEnumerable<int> ReturnAList()
    {
        Console.WriteLine("ReturnAList called");
        return new List<int>()
        {
            1, 1, 2, 3, 5, 8, 13, 21, 34
        };
    }
}

然后:

var test = new Test();
foreach(var t in test.ReturnAList())
{
    Console.WriteLine(t);
}

您将看到输出为:

//  ReturnAList called
//  1
//  1
//  2
//  3
//  5
//  8
//  13
//  21
//  34

答案 2 :(得分:0)

感谢您的见解。

但是我已经编写了一个控制台应用程序,第一个例子(直接迭代Take())在执行中消耗的时间比后者少。