如何在IEnumerable.Select中使用IO方法(例如Console.Write,StreamWriter等)?

时间:2016-11-07 20:26:21

标签: c# linq

我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        Console.Write("By ForEach : ");
        Enumerable.Range(0, 5).ToList().ForEach(i => { Console.Write(i); });
        Console.WriteLine("");
        Console.Write("By Select : ");
        Enumerable.Range(0, 5).ToList().Select(i => { Console.Write(i); return i; });
        Console.WriteLine("");
        using (var sw = new StreamWriter("out.txt"))
        {
            sw.Write("By ForEach : ");
            Enumerable.Range(0, 5).ToList().ForEach(i => { sw.Write(i); });
            sw.WriteLine("");
            sw.Write("By Select : ");
            Enumerable.Range(0, 5).ToList().Select(i => { sw.Write(i); return i; });
            sw.WriteLine("");
        }
    }
}

通过运行此命令,我在Console和out.txt中得到了以下结果。 :

By ForEach : 01234
By Select : 

我想知道的要点是:

  • Console.Write和Streamwriter.Write的输出在哪里?
  • 这种问题有解决方案吗?

1 个答案:

答案 0 :(得分:4)

  

Console.WriteStreamwriter.Write的输出在哪里?

ForEach执行立即传入的委托。 .Select只创建一个查询,其执行被推迟到您实际迭代之后。如果您在ToList

的末尾添加Select,则会看到输出结果
Enumerable.Range(0, 5).ToList().Select(i => { Console.Write(i); return i; }).ToList();

然而 - Linq 意味着用于执行具有副作用的代码。您只需致电ToList即可拨打ForEach这一事实表明您没有使用正确的工具来完成您的工作。如果要输出所有数字,只需使用传统的foreach循环:

foreach(int i in Enumerable.Range(0, 5))
{
    Console.Write(i); 
}

Select旨在将集合和转换项目带到集合。 意味着要根据输入替换您想要执行某些操作的传统foreach循环。