Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:在foreach is语句中使用Take()可以吗?_C#_Linq_Foreach_Ienumerable_Ienumerator - Fatal编程技术网

C#:在foreach is语句中使用Take()可以吗?

C#:在foreach is语句中使用Take()可以吗?,c#,linq,foreach,ienumerable,ienumerator,C#,Linq,Foreach,Ienumerable,Ienumerator,有人能建议我们应该使用下面哪两行代码吗 foreach(var items in itemList.Take(20)) { } 或 以上两行在优化代码方面是否有任何差异,如果有,请告诉我原因。否,这两段代码的行为不会有所不同 事实上,如果你看一下这个,你会注意到这两段代码编译成完全相同的IL 因此: 代码看起来不一样,如果对您很重要,请选择您觉得最舒服的代码 代码将编译为精确的相同输出(在发布版本中),在这种情况下,代码的外观(在本例中)对代码的行为或性能没有影响 简言之,选择您认为最合

有人能建议我们应该使用下面哪两行代码吗

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

}


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

否,这两段代码的行为不会有所不同

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

因此:

  • 代码看起来不一样,如果对您很重要,请选择您觉得最舒服的代码
  • 代码将编译为精确的相同输出(在发布版本中),在这种情况下,代码的外观(在本例中)对代码的行为或性能没有影响

简言之,选择您认为最合适的版本。

foreach
在关键字中的
之后只对方法进行一次评估。一个非常简单的示例,如
控制台应用程序

public class Test
{
    public IEnumerable<int> ReturnAList()
    {
        Console.WriteLine("ReturnAList called");
        return new List<int>()
        {
            1, 1, 2, 3, 5, 8, 13, 21, 34
        };
    }
}
您将看到输出将是:

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

谢谢你的洞察力


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

挑剔:注意,在第二个示例中,您不能重新声明
itemList
,如果
itemList
不是
IEnumerable
,而是
List
,那么简单地删除
var
也不会起作用。然而,这只是一个观察结果,对我的答案没有影响。它们是一样的,以可读性更好的为准。这两个版本都是同样未优化的个人观点:For
Take(20)
我可能会使用前一个示例,但如果您将
Take
替换为
Where
或类似的,那么我可能会使用后一个示例,以便能够在for循环上放置断点,并在循环之前检查过滤的集合。
var test = new Test();
foreach(var t in test.ReturnAList())
{
    Console.WriteLine(t);
}
//  ReturnAList called
//  1
//  1
//  2
//  3
//  5
//  8
//  13
//  21
//  34