Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回错误用法_C#_.net_Linq_Ienumerable_Yield Return - Fatal编程技术网

C# 返回错误用法

C# 返回错误用法,c#,.net,linq,ienumerable,yield-return,C#,.net,Linq,Ienumerable,Yield Return,我有以下代码: private IEnumerable<StatsSnapshot> ProcessPeriodicities(ICollection<StatsSnapshot> newStats) { foreach (var s in newStats) { yield return ProcessPeriodicity(s, PeriodicityEnum.LastMinute);

我有以下代码:

    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);
        }
    }
我希望
ProcessPeriodicities
函数返回每个
ProcessPeriodicity
结果的“串联”,但它只返回第一个结果-它在第一次调用后立即返回(
yield return ProcessPeriodicity(s,PeriodicityEnum.LastMinute);

我必须改变什么,我显然错误地使用了
收益率
概念

编辑:
ProcessPeriodicities
调用:

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

        return result;
    }
public ICollection ProcessStats(ICollection newStats)
{
var结果=处理周期(新闻状态)
.其中(i=>i!=null)
.ToArray();
返回结果;
}

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

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
{

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
Console.WriteLine(“你好世界”);
var list=新列表();
添加(新StatsSnapshot());
添加(新StatsSnapshot());
var结果=处理周期(列表)
.其中(i=>i!=null)
.ToArray();
}
私有静态IEnumerable ProcessPeriodicities(ICollection newStats)
{
foreach(新闻状态中的var s)
{
产量-收益过程周期(s,1);
产量回归过程周期(s,2);
产量回归过程周期(s,3);
产量回归过程周期(s,4);
产量-收益过程周期(s,5);
WriteLine(“完成了foreach循环”);
}
}
专用静态StatsSnapshot处理周期(StatsSnapshot,int i)
{
控制台写入线(i);
返回s;
}
}
公共类StatsSnapshot
{
}

foreach
只是
循环的语法糖,而
循环则通过
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”
。而
yieldbreak
只会使
MoveNext
返回false


这应该可以解释为什么调试器会前后跳转。

您如何调用
进程周期性
?如果您使用
foreach
,它将正确处理
LastMinute
的整个结果集,甚至在尝试调用
lasthhour
@camilotereven查看我的编辑之前请查看下面的.NET Fiddle。这应该有助于理解它是如何工作的:谢谢@CamiloTerevinto-我不确定是否能理解…从你的小提琴来看,你使用的收益率回报率和我完全一样,但它工作了吗?我的代码中是否有错误,或者我只是调试不正确……不,您使用的是正确的。调试器正在欺骗您,使您相信不是这样
yield return
将调试器返回给调用者,调用者将处理每个项目,然后调试器将返回到下一行(
lasthhour
在您的情况下,
2
在我的小提琴中)。请注意,调用方是
ToArray()
,因为
。Where()
调用没有枚举源,所以您必须一直使用F11
using (var messageEnumerator = message.GetEnumerator())
{
    while (messages.MoveNext())
    {
        var message = messages.Current;

        Console.WriteLine(message);
    }
}