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 错误。
这应该可以解释调试器来回跳转的原因。
我有这个代码:
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 错误。
这应该可以解释调试器来回跳转的原因。