gpt4 book ai didi

c# - File.ReadLines(file).Skip(numLines) 是如何工作的?

转载 作者:太空狗 更新时间:2023-10-30 00:31:16 26 4
gpt4 key购买 nike

我有一个相当大的文件,我希望从特定行读取。我找到了

File.ReadLines(file).Skip(numLines);

效果很好。但是,我不明白这是如何在表面下工作的。我写了几个基本的基准测试,看看是否与一些同事建议的方式有性能差异。我测试的方法是:

  1. StreamReader 用于读取到该点的所有行:

    public string streamToLine(int lineNumber)
    {
    StreamReader reader = new StreamReader(fileName);

    for (int i = 0; i < lineNumber - 1; i++)
    {
    reader.ReadLine();
    }

    string line = reader.ReadLine();
    reader.Close();

    return line;
    }
  2. File.ReadLines(file) 并使用枚举器迭代到该行:

    public string readToLine(int lineNumber)
    {
    IEnumerator<string> lines = File.ReadLines(fileName).GetEnumerator();
    for (int i = 0; i < lineNumber; i++)
    {
    lines.MoveNext();
    }
    return lines.ToString();
    }
  3. 使用跳过功能:

    public string skipToLine(int lineNumber)
    {
    IEnumerator<string> lines = File.ReadLines(fileName).Skip(lineNumber-1).GetEnumerator();

    return lines.ToString();
    }

我在一个包含 1000 万行的文件上运行了 10 次测试,试图读取第 9 百万行并计算平均花费的时间(以毫秒为单位):

流到线:2442.1

读取行:2534.9

跳到行:0

看起来 Skip 甚至没有考虑 lineNumber 之前的其他行,并且确切地知道第 9 百万行在哪里。它是否以某种方式从文件中推断出这一点?其他两种方法处理行的方式是否有一些开销,因为它们返回读取的内容?怎么会有这么大的差别?

最佳答案

基本上,问题出在您的测试上。您尚未对枚举器调用 MoveNext(),因此它尚未执行任何操作。迭代器通常是延迟的和流式的,尤其是在 LINQ 的情况下。

顺便说一下,您需要使用 GetEnumerator() 的情况非常;访问此类数据的惯用方法是通过 foreach

如果你想看到这个效果:

    static void Main()
{
using(var iter = GetData().GetEnumerator())
{
System.Console.WriteLine("Have iterator");
while(iter.MoveNext())
{
System.Console.WriteLine(iter.Current);
}
System.Console.WriteLine("Done");
}
}
static IEnumerable<int> GetData()
{
System.Console.WriteLine("Before doing anything");
yield return 1;
yield return 2;
yield return 3;
System.Console.WriteLine("Ater doing everything ");
}

你应该注意到 "Have iterator" 写在 before "Before doing anything",这告诉我们可以有一个迭代器那还没有做任何事情。这是第一个使其打印的 MoveNext()

关于c# - File.ReadLines(file).Skip(numLines) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28148077/

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