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);
}
}