我有这段代码:
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}}
答案 0 :(得分:0)
感谢@ 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
{
}
答案 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。
这可以解释调试器来回跳转的原因。