【发布时间】:2020-01-30 21:53:02
【问题描述】:
IEnumerable<char> query = "Not what you might expect";
query = query.Where(c=>c!='a');
query = query.Where(c=>c!='e');
query = query.Where(c=>c!='i');
query = query.Where(c=>c!='o');
query = query.Where(c=>c!='u');
foreach(char c in query) Console.Write(c);
简单的 LINQ 查询构建。 我的问题是,为什么所有这些查询都会执行?为什么不只有最后一个? 这是如何编译的,程序如何知道返回查询初始化? 希望你能理解我的问题。
我知道这段代码有效且直观,但幕后发生了什么?
【问题讨论】:
-
您将每个过滤器的结果分配回查询变量。为什么每个人都不执行?
-
将其视为
StringBuilder,通过调用builder.Append(value).Append(another),您将收集需要在最终字符串中的所有数据,通过调用.ToString(),您实际上构建了一个新字符串。 -
我不确定我是否理解您的问题。最后一行确实执行了。评估
Where语句的“时间”将在 ForEach 循环内的 GetEnumerator 期间进行。 -
您是否在问为什么每个
Where都会为foreach的每次迭代执行?这可能是因为 LINQ 被延迟评估。 -
延迟执行