IEnumerable在没有实际被调用的情况下发生过滤

Ant*_*haw 0 c# linq

我正在使用HtmlAgilityPack来解析HTML页面并从选择列表中检索许多选项元素.

这GvsaDivisions是一个从POST结果返回原始html的方法,在问题的上下文中是不敬的

public IEnumerable<SelectListItem> Divisions(string season, string gender, string ageGroup)
{
    var document = new HtmlDocument();
    var html = GvsaDivisions(season);
    document.LoadHtml(html);

    var options = document.DocumentNode.SelectNodes("//select//option").Select(x => new SelectListItem() { Value = x.GetAttributeValue("value", ""), Text = x.NextSibling.InnerText });

    var divisions = options.Where(x => x.Text.Contains(string.Format("{0} {1}", ageGroup, gender)));
    if (ageGroup == "U15/U16")
    {
        ageGroup = "U15/16";
    }
    if (ageGroup == "U17/U19")
    {
        ageGroup = "U17/19";
    }

    return divisions;
}
Run Code Online (Sandbox Code Playgroud)

我正在观察的是......一旦options.Where()执行,分区包含一个结果.在测试ageGroup == "U15/U16"和分配后ageGroup = "U15/16",分区现在包含3个结果(原始1,添加2个新匹配的新值的标准ageGroup

任何人都可以解释这种异常现象吗?我希望将一个新的Where查询的结果调用到Union的原始结果,但它似乎是自动发生的.虽然结果是我想要的,但我无法解释它是如何发生的(或者它将继续以这种方式行事的确定性)

Moh*_*han 6

LINQ查询使用延迟执行,这意味着只要枚举结果就会运行它们.

当您更改查询中使用的变量时,实际上您正在更改下次运行查询的结果,这是下次迭代结果时的结果.

在这里和这里阅读更多相关信息:

这实际上是按设计进行的,在许多情况下它非常有用,有时也是必要的.但是,如果您需要立即进行评估,可以ToList()在查询结束时调用该方法,这将使您查询并为您提供正常的List<T>对象.