我具有产生返回值的函数。但是我的行为很奇怪。
此函数内的代码从不调用。因此,我的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;
});
答案 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;
}
我循环调用此代码,因此我可以从枚举器的当前位置继续。