c# - yield 看不懂的功能

标签 c# .net visual-studio-2010

首先,我已经对此进行了搜索,但我仍然无法理解何时使用 yield。

例如我有下面的代码:

string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

public System.Collections.IEnumerator GetEnumerator()
{
    for (int i = 0; i < days.Length; i++)
    {
        yield return days[i];
    }
}

上面的代码和下面的代码有什么区别?

string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

public System.Collections.IEnumerator GetEnumerator()
{
    for (int i = 0; i < days.Length; i++)
    {
        return days[i];
    }
}

你能告诉我什么时候使用 yield 吗?

最佳答案

return 方法不会记住您在数组中的位置。每次您使用它时,它都会返回星期日,因为它每次都从零开始循环。

使用 yield 更多(至少在概念上)“我会返回这个值,但是,下次你调用我时,我会从我离开的地方继续(在循环内) ".

在 C 中可以通过使用静态变量来记住您的位置来完成类似的事情:

char *nextDay () {
    static char *days[] = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
    static int nextDay = -1;
    nextDay = (nextDay + 1) % (sizeof (days) / sizeof (*days));
    return days[nextDay];
}

事实上,nextDay 变量在函数的调用中保持不变,这意味着它可用于循环遍历数组。

关于c# - yield 看不懂的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043237/

相关文章:

c# - 在 C# 中制作一个不可聚焦的表单

c# - 如何将静态类包装在非静态实例对象中(动态地)

visual-studio-2010 - 在 Windows 8 上的 Visual Studio 2010 中启用异步 CTP

c# - 如何以编程方式创建 Func<> 委托(delegate)

c# - UWP AutoNext 函数

.net - 有没有办法将使用 .appref-ms 的 ClickOnce 应用程序添加到系统路径?

.net - StringBuilder 的 RAM 消耗情况如何?

JavaScript 数学公式编辑器?

c# - Datagridview 不显示任何内容,既没有列标题也没有数据

c# - 强命名会导致 C# 中的对象序列化问题吗?