C#不会使用SkipWhile枚举返回枚举数的函数

时间:2019-08-30 08:34:55

标签: c# linq ienumerable

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

此函数内的代码从不调用。因此,我的SkipWhile仅在没有迭代枚举的情况下退出。

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

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

1 个答案:

答案 0 :(得分: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;
}

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