代码之家  ›  专栏  ›  技术社区  ›  Bruno

收益率返回错误用法

  •  0
  • Bruno  · 技术社区  · 7 年前

    我有这个密码:

        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 函数返回 ProcessPeriodicity 结果,但它只返回第一个-它在第一个调用后立即返回( yield return ProcessPeriodicity(s, PeriodicityEnum.LastMinute); )

    我必须改变什么,我显然在用 yield return 概念不正确…

    编辑: 加工周期 呼叫:

        public ICollection<StatsSnapshot> ProcessStats(ICollection<StatsSnapshot> newStats)
        {
            var result = ProcessPeriodicities(newStats)
                .Where(i => i != null)
                .ToArray();
    
            return result;
        }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   cwharris    7 年前

    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 返回真值,并且 Current 返回 "whatever" . 反之 yield break 只做 移到下一行 返回false。

    这应该可以解释为什么调试器来回跳转。

        2
  •  0
  •   Camilo Terevinto Chase R Lewis    7 年前

    多亏@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
    {
    
    }