gpt4 book ai didi

c# - 在没有 ToList() 的情况下运行时,在 Linq 的 SelectMany() 中读取文件会抛出 System.IO.IOException

转载 作者:行者123 更新时间:2023-11-30 20:28:02 25 4
gpt4 key购买 nike

我很好奇为什么以下代码会因 System.IO.IOException 而失败,表示该进程无法访问该文件,因为它正被另一个进程使用。

class Program
{
static void Main(string[] args)
{
const string filename = "tmp.txt";
File.AppendAllText(filename, "x");
var output = Enumerable.Range(0, 10).SelectMany(_ => File.ReadAllLines(filename));
File.WriteAllLines(filename, output);
}
}

通过在 Linq 管道的末尾简单地抛出一个 ToList(),我避免了这个问题,但我一直无法弄清楚为什么会这样。

最佳答案

您会看到 Linq 惰性物化 的影响。

添加了 .ToList(),我们得到了 output materialized:Linq 执行查询(打开文件,填充集合并关闭文件):

 // List<T> collection
var output = Enumerable
.Range(0, 10)
.SelectMany(_ => File.ReadAllLines(filename))
.ToList(); // <- We want a collection in memory

所以当需要写入时,我们将数据从内存写入磁盘

 // Writing down the collection
File.WriteAllLines(filename, output);

没有 .ToList() Linq(懒惰)什么都不做:

 // IEnumerable<T> 
var output = Enumerable
.Range(0, 10)
.SelectMany(_ => File.ReadAllLines(filename)); // <- No more than a declaration

什么时候写

 File.WriteAllLines(filename, output);

Linq 发现它必须提供应该写入的数据 - output 并开始执行此操作:它尝试打开文件但此操作失败,因为文件已使用 File.WriteAllLines 打开。

关于c# - 在没有 ToList() 的情况下运行时,在 Linq 的 SelectMany() 中读取文件会抛出 System.IO.IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47903929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com