gpt4 book ai didi

c# - File.ReadLines 上的 IEnumerable.Take(0) 似乎没有处理/关闭文件句柄

转载 作者:IT王子 更新时间:2023-10-29 04:15:55 27 4
gpt4 key购买 nike

我有一个函数可以跳过 n 行代码并使用 File.ReadLines 从给定文件中获取 y 行SkipTake 组合。当我下次尝试打开 filePath 给定的文件时:

string[] Lines = File.ReadLines(filePath).Skip(0).Take(0).ToArray();
using (StreamWriter streamWriter = new StreamWriter(filePath))
{
// ...
}

我在“using”行收到一个File in use by another process异常。

看起来 IEnumerable.Take(0) 是罪魁祸首,因为它返回一个空的 IEnumerable 而没有枚举 File.ReadLines( ),我认为这不会处理文件。

我说的对吗?他们不应该枚举以避免这种错误吗?如何正确执行此操作?

最佳答案

这基本上是 File.ReadLines 中的错误, 不是 Take . ReadLines返回 IEnumerable<T> ,这在逻辑上应该是惰性的,但它急切地打开文件。除非您实际迭代返回值,否则您没有什么可处理的。

在仅迭代一次方面被破坏了。例如,您应该能够编写:

var lines = File.ReadLines("text.txt");
var query = from line1 in lines
from line2 in lines
select line1 + line2;

...应该给出文件中行的叉积。它没有,因为 splinter 。

File.ReadLines 应该像这样实现:

public static IEnumerable<string> ReadLines(string filename)
{
return ReadLines(() => File.OpenText(filename));
}

private static IEnumerable<string> ReadLines(Func<TextReader> readerProvider)
{
using (var reader = readerProvider())
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}

不幸的是它不是:(

选项:

  • 用上面的代替File.ReadLines
  • 编写自己的 Take 实现总是开始迭代,例如

    public static IEnumerable<T> Take<T>(this IEnumerable<T> source, int count)
    {
    // TODO: Argument validation
    using (var iterator = source.GetEnumerator())
    {
    while (count > 0 && iterator.MoveNext())
    {
    count--;
    yield return iterator.Current;
    }
    }
    }

关于c# - File.ReadLines 上的 IEnumerable.Take(0) 似乎没有处理/关闭文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39142622/

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