OpenText 与 ReadLines

Tyr*_*ess 4 c# file-io stream readline

我遇到了一个逐行读取文件的实现,如下所示:

using (StreamReader reader = File.OpenText(path))
while (!reader.EndOfStream)
{
    string line = reader.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

但就我个人而言,我会这样做:

foreach (string line in File.ReadLines(path))
{

}
Run Code Online (Sandbox Code Playgroud)

有什么理由选择其中之一吗?

Ian*_*Ian 5

客观地:

\n\n
    \n
  • 第一个是逐条选择线路,然后您在流式传输数据时执行该过程。

  • \n
  • 第二个IEnumerable<string>立即生成,然后您可以开始处理这些行(来源MSDNReadAllLines - 我很抱歉首先将其混合)。

  • \n
\n\n

用处?:

\n\n
    \n
  • 从这个意义上来说,第一个更加“流畅”。因为你可以随意选择采取/处理和中断/继续。每当你需要一行时,你就拿一条,处理它,然后选择中断或继续。您甚至可以选择不再乘坐任何线路(假设您已经yield在循环中while),直到您想随意返回为止
  • \n
  • 第二个将得到IEnumerable<string>(即,在处理之前指定预期数据的信息),因此一开始会产生一些开销。但值得注意的是,IEnumerableList. 一些值得阅读好信息
  • \n
\n\n

以下是来自 MSDN 的用例ReadLines

\n\n
\n

对文件执行 LINQ to Objects 查询以获取其行的过滤集。

\n\n

使用 File.WriteAllLines(String,\xe2\x80\x82IEnumerable<String>) 方法将返回的行集合写入文件,或使用以下方法将它们附加到现有文件\n

\n\n

File.AppendAllLines(String,\xe2\x80\x82IEnumerable<String>) 方法。创建一个立即填充的集合实例,该实例采用 IEnumerable<T> 字符串集合作为其构造函数,例如 IList<T> 或 Queue<T>。

\n
\n

  • 可枚举的唯一开销是一次额外的堆分配(一次),然后每次迭代进行 2 个虚拟调用(“MoveNext”和“Current”)。如今,必须有非常特殊的要求才能计算这些东西:) (3认同)