C#won';t枚举返回';使用SkipWhile的s枚举器

C#won';t枚举返回';使用SkipWhile的s枚举器,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个返回值的函数。但我有奇怪的行为 此函数中的代码从不调用。因此,我的SkipWhile只会退出,而不会迭代枚举 但是,如果我使用foreach、firstordefilet进行迭代,一切都可以 我在SkipWhile谓词中尝试了不同的条件-没有结果 所以我不明白为什么 为什么SkipWhile忽略了枚举器 public IEnumerable GetLmaxTicks(字符串工具) { 使用(var@if=File.OpenRead(Path.Combine(_dbDir,$“Ticks{

我有一个返回值的函数。但我有奇怪的行为

此函数中的代码从不调用。因此,我的SkipWhile只会退出,而不会迭代枚举

但是,如果我使用foreach、firstordefilet进行迭代,一切都可以

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

所以我不明白为什么

为什么SkipWhile忽略了枚举器

public IEnumerable GetLmaxTicks(字符串工具)
{
使用(var@if=File.OpenRead(Path.Combine(_dbDir,$“Ticks{{u lmaxMappings[instrument]}.csv”))
使用(var sr=new StreamReader(@if,Encoding.ASCII,true,16*1024*1024))
{
var line=“”;
而((line=sr.ReadLine())!=null)
{
var(created,tick)=Csv.Csv.deserializer0w(line.Split(',),true);
如果(!已创建)
{
继续;
}
收益回报率;
}
}
}
LmaxTick lmaxPrev=null;
lmaxTicks=lmaxTicks.SkipWhile(t=>
{
if(DateTimeOffset.FromUnixtimeMissions((长)t.TimestampMsec)>=date.date+time.TimeOfDay)
{
返回false;
}
lmaxPrev=t;
返回true;
});
我自己发现的

枚举数是懒惰的,因为我没有向它们请求任何项目,所以它们什么也不做。 在我的例子中,我需要使用例如
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;
}
我在循环中调用这段代码,所以我可以从枚举器的当前位置继续