在C#foreach循环中检索对象列表的次数是多少?

在C#foreach循环中检索对象列表的次数是多少?,c#,foreach,C#,Foreach,在运行foreach循环之前,我通常尝试将数组/集合存储为局部变量:而不是在foreach内部调用Get函数。这是因为我假设它必须在循环的每次迭代中获取该数组,我宁愿它只需要获取一次数组/集合。我很难找到支持我理论的文档,所以我想问问大师 //Assume that FindStringsContaining() is a CPU //intensive operation. Does it run only once? foreach(string data in FindStringsCon

在运行foreach循环之前,我通常尝试将数组/集合存储为局部变量:而不是在foreach内部调用Get函数。这是因为我假设它必须在循环的每次迭代中获取该数组,我宁愿它只需要获取一次数组/集合。我很难找到支持我理论的文档,所以我想问问大师

//Assume that FindStringsContaining() is a CPU
//intensive operation. Does it run only once?
foreach(string data in FindStringsContaining("Data"))
{
    //use the data
}

它将始终精确地运行一次

Foreach在一个
IEnumerable
上操作,并简单地在集合上迭代;在循环中为找到的每个项执行代码


请注意,不允许在枚举期间修改集合(这可能需要重新枚举)(将引发
InvalidOperationException

方法调用只会发生一次。然后,它返回一个
IEnumerable
,该函数以流式方式迭代(在项目保留在集合中或未命中中断时调用
MoveNext
方法)。

它被调用一次。验证这一点的快速方法是在FindStringsContaining()方法中放置一个断点,您可以看到它只被命中一次。

它只被调用一次您可以拥有一个整洁的小程序@Jeroenvanevel。我没有想到这一点,因为我没有被调用函数的源代码。我主要担心的一个问题是,如果每次都有get发生,那么集合可能会被修改。了解这个异常可以帮助我理解它是如何工作的。