首页 > 解决方案 > 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;
            }
        }
    }
}

标签: c#linq

解决方案


当一个方法包含一个yield return语句时,它就变成了一个“迭代器块”。它将被懒惰地评估。这意味着在某些客户端枚举返回的内容之前,代码不会执行IEnumerable<int>

要查看结果,请像这样调用它:

var results = PrintResults(queryResults);
foreach (var result in results)
{
    // do something
}

“折叠”迭代器的另一种方法是调用.ToList()返回值。这将导致它像foreach循环一样被枚举:

var results = PrintResults(queryResults).ToList();

Jon Skeet 在这里更详细地描述了迭代器块。


推荐阅读