收益率返回错误用法

时间:2018-06-16 01:15:40

标签: c# .net linq ienumerable yield-return

我有这段代码:

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

和这个功能

ProcessPeriodicities

我希望ProcessPeriodicity函数返回每个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; } 来电:

{{1}}

2 个答案:

答案 0 :(得分:0)

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

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
{

}

答案 1 :(得分:0)

foreach只是while循环的语法糖,它循环遍历IEnumerable

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返回true,Current会返回"whatever"。而yield break只会使MoveNext返回false。

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