Yield return 不正确的用法

Yield return incorrect usage

我有这个代码:

    private IEnumerable<StatsSnapshot> ProcessPeriodicities(ICollection<StatsSnapshot> newStats)
    {
        foreach (var s in newStats)
        {
            yield return ProcessPeriodicity(s, PeriodicityEnum.LastMinute);
            yield return ProcessPeriodicity(s, PeriodicityEnum.LastHour);
            yield return ProcessPeriodicity(s, PeriodicityEnum.LastDay);
            yield return ProcessPeriodicity(s, PeriodicityEnum.LastWeek);
            yield return ProcessPeriodicity(s, PeriodicityEnum.LastMonth);
        }
    }

和这个函数

    private StatsSnapshot ProcessPeriodicity(StatsSnapshot newStat, PeriodicityEnum p)
    {
        // ....
    }

我希望 ProcessPeriodicities 函数能够 return 每个 ProcessPeriodicity 结果的 "concatenation",但它只是 return 第一个 -它 return 就在第一次调用 (yield return ProcessPeriodicity(s, PeriodicityEnum.LastMinute);)

之后

我必须改变什么,我显然错误地使用了 yield return 概念...

编辑:ProcessPeriodicities 调用:

    public ICollection<StatsSnapshot> ProcessStats(ICollection<StatsSnapshot> newStats)
    {
        var result = ProcessPeriodicities(newStats)
            .Where(i => i != null)
            .ToArray();

        return result;
    }

感谢@CamiloTerevinto 的解释,看来我使用的关键字是正确的。请参阅 his fiddle(在问题评论中)以更好地了解正在发生的事情

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");

        var list = new List<StatsSnapshot>();
        list.Add(new StatsSnapshot());
        list.Add(new StatsSnapshot());

        var result = ProcessPeriodicities(list)
            .Where(i => i != null)
            .ToArray();
    }


    private static IEnumerable<StatsSnapshot> ProcessPeriodicities(ICollection<StatsSnapshot> newStats)
    {
        foreach (var s in newStats)
        {
            yield return ProcessPeriodicity(s, 1);
            yield return ProcessPeriodicity(s, 2);
            yield return ProcessPeriodicity(s, 3);
            yield return ProcessPeriodicity(s, 4);
            yield return ProcessPeriodicity(s, 5);

            Console.WriteLine("Finished a foreach loop");
        }


    }

    private static StatsSnapshot ProcessPeriodicity(StatsSnapshot s, int i)
    {
        Console.WriteLine(i);

        return s;
    }
}

public class StatsSnapshot
{

}

foreach 只是遍历 IEnumerable.

while 循环的语法糖
foreach (var message in messages)
{
    Console.WriteLine(message);
}

字面意思

using (var messageEnumerator = message.GetEnumerator())
{
    while (messages.MoveNext())
    {
        var message = messages.Current;

        Console.WriteLine(message);
    }
}

yield return "whatever" 只是让 MoveNext return 为真,Current return "whatever"。而 yield break 只会使 MoveNext return 错误。

这应该可以解释调试器来回跳转的原因。