首页>Program>source

假设我有以下代码:

foreach(string str in someObj.GetMyStrings())
{
    // do some stuff
}

维兹威兹 在循环的每次迭代中被调用? 最好改为执行以下操作:

someObj.GetMyStrings()

List<string> myStrings = someObj.GetMyStrings(); foreach(string str in myStrings) { // do some stuff }
最新回答
  • 2021-1-11
    1 #

    该函数仅调用一次,以返回 IEnumerator<T> ; 在那之后, MoveNext() 方法和 Current 属性用于遍历结果:

    foreach (Foo f in GetFoos())
    {
        // Do stuff
    }
    

    等效于:

    using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
    {
        while (iterator.MoveNext())
        {
            Foo f = iterator.Current;
            // Do stuff
        }
    }
    

    请注意,迭代器放置在末尾-这对于从迭代器块分配资源尤其重要,例如:

    public IEnumerable<string> GetLines(string file)
    {
        using (TextReader reader = File.OpenText(file))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }
    

    在上面的代码中,您确实希望在完成迭代后关闭文件,并且编译器实现了 IDisposable

  • 2021-1-11
    2 #

    否。该函数将被调用一次以获取IEnumerable ..然后将重复调用MoveNext和Current。

  • 2021-1-11
    3 #

    GetMyStrings ()重新调整IEnumerable类型的对象.运行时知道如何处理.它先调用IEnumerable.GetEnumerator(),然后在该枚举器对象上调用MoveNext()和Current。

  • 2021-1-11
    4 #

    只是为了解决问题,以防万一您陷入"所有相同"的情况。 for(int x = 0; x

  • python:使用ftplib下载目录树
  • size:在C中,为什么'a'是一个整数,为什么sizeof(char)1是?