【问题标题】:C# won't enumerate function which return's enumerator using SkipWhileC# 不会使用 SkipWhile 枚举返回枚举器的函数
【发布时间】:2023-04-10 06:34:01
【问题描述】:

我有产生返回值的函数。但我有奇怪的行为。

此函数内的代码从不调用。所以,我的 SkipWhile 只是退出而不迭代可枚举。

但如果我使用 foreach 进行迭代,FirstOrDefult - 一切正常。

我在 SkipWhile 谓词中尝试了不同的条件 - 没有结果。

所以我不明白 - 为什么。

为什么 SkipWhile 只是忽略枚举器。

public IEnumerable<LmaxTick> GetLmaxTicks(string instrument)
{
    using (var @if = File.OpenRead(Path.Combine(_dbDir, $"Ticks{_lmaxMappings[instrument]}.csv")))
    using (var sr = new StreamReader(@if, Encoding.ASCII, true, 16 * 1024 * 1024))
    {
        var line = "";
        while ((line = sr.ReadLine()) != null)
        {
            var (created, tick) = Csv.Csv<LmaxTick>.DeserializeRow(line.Split(','), true);
            if (!created)
            {
                continue;
            }

            yield return tick;
        }
    }
}


LmaxTick lmaxPrev = null;
lmaxTicks = lmaxTicks.SkipWhile(t =>
{
    if (DateTimeOffset.FromUnixTimeMilliseconds((long)t.TimestampMsec) >= date.Date + time.TimeOfDay)
    {
        return false;
    }
    lmaxPrev = t;
    return true;
});

【问题讨论】:

    标签: c# linq ienumerable


    【解决方案1】:

    我自己发现的。

    枚举器是懒惰的,所以因为我没有向他们请求任何项目,所以他们什么也不做。 在我的情况下,我需要使用例如First()

    或者,更好的解决方案

    var lmaxEnumerator = lmaxTicks.GetEnumerator();
    LmaxTick lmaxPrev = null;
    
    while (lmaxEnumerator.MoveNext())
    {
        if (DateTimeOffset.FromUnixTimeMilliseconds((long)lmaxEnumerator.Current.TimestampMsec) >= date.Date + time.TimeOfDay)
        {
            break;
        }
        lmaxPrev = lmaxEnumerator.Current;
    }
    

    我循环调用这段代码,所以我可以从枚举器的当前位置继续。

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多