c# - Linq Query 执行方法失败
问题描述
在学习 Linq 时,我编写了下面的代码,问题是“PrintResults()”方法永远不会执行。我不明白为什么!?我正在尝试做的事情可能吗?
谢谢你。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Linq
{
class Program
{
static void Main(string[] args)
{
int[] scores = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//IEnumerable<int> query =
// from score in scores
// where score % 2 == 0
// select score;
// Console.WriteLine(score);
IEnumerable<int> queryResults = scores.Where(x => x % 2 == 0).ToList().Take(2);
PrintResults(queryResults);
}
static IEnumerable<int> PrintResults(IEnumerable<int> input)
{
foreach (var score in input)
{
Console.WriteLine(score);
yield return score;
}
}
}
}
解决方案
当一个方法包含一个yield return
语句时,它就变成了一个“迭代器块”。它将被懒惰地评估。这意味着在某些客户端枚举返回的内容之前,代码不会执行IEnumerable<int>
。
要查看结果,请像这样调用它:
var results = PrintResults(queryResults);
foreach (var result in results)
{
// do something
}
“折叠”迭代器的另一种方法是调用.ToList()
返回值。这将导致它像foreach
循环一样被枚举:
var results = PrintResults(queryResults).ToList();
Jon Skeet 在这里更详细地描述了迭代器块。
推荐阅读
- neo4j - 图数据库或关系数据库公用表扩展:比较非循环图查询性能
- c - MPI_Reduce 遇到问题
- reactjs - 安装时反应应用程序 npm 错误
- ssis - 将 9 位字符串转换为数字并添加逗号
- css - 具有视口最大高度的 CSS 响应式图像
- php - Sendinblue smtp 10 多分钟后收到邮件
- pandas - 如何设置 Prophet 的 cross_validation() 函数?
- c# - ForEach() 给出“在前一个操作完成之前在此上下文上启动的第二个操作”。foreach 循环不
- javascript - 我的数组没有获取正确的值
- wordpress - 从 url 获取产品,每 15 分钟更新一次?