【问题标题】:OpenText vs ReadLinesOpenText 与 ReadLines
【发布时间】:2016-04-27 06:06:57
【问题描述】:

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

using (StreamReader reader = File.OpenText(path))
while (!reader.EndOfStream)
{
    string line = reader.ReadLine();
}

但我个人会这样做:

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

}

有什么理由选择一个而不是另一个吗?

【问题讨论】:

标签: c# file-io stream readline


【解决方案1】:

客观上:

  • 第一个是一个接一个地挑线,你做这个过程 当您流式传输数据时。

  • 第二个立即生成IEnumerable<string> 然后你可以 开始处理这些行(来源MSDN - 我很抱歉混合它 首先是ReadAllLines)。

有用吗?:

  • 从这个意义上说,第一个更“流畅”。因为你可以选择 随意采取/处理和中断/继续。每次你需要一条线,你就拿一条线,你处理它,然后你选择中断或继续。您甚至可以选择不采取任何进一步的路线(假设您在 while 循环中有 yield),直到您想随意返回为止
  • 第二个会得到IEnumerable<string>(即在处理之前指定预期数据的信息),因此首先会产生一些开销。然而,需要注意的是,这个开销相对较小,因为IEnumerable 推迟了实际执行,这与List 不同。一些good inforead

以及来自MSDN的以下是ReadLines的用例:

对文件执行 LINQ to Objects 查询以获得过滤的一组 它的线条。

将返回的行集合写入文件 File.WriteAllLines(String, IEnumerable) 方法,或附加它们 到一个现有的文件与

File.AppendAllLines(String, IEnumerable) 方法。创建一个 立即填充的集合实例,该实例采用 IEnumerable 其构造函数的字符串集合,例如 IList 或队列

【讨论】:

  • 第二个实际上并没有一次加载所有行,它返回一个IEnumerable<string> - 并且文档明确说明(File.ReadAllLines 会像你提到的那样表现) - msdn.microsoft.com/en-us/library/…
  • 我实际上并不知道 IEnumerable 在所有迭代前都有开销(真的吗?)
  • @Tyress 我个人从未遇到过如此多的性能缺陷。但是有消息称,当 IEnumerable 项的数量很高时,可以看到影响..也许这是其中之一:tomfosdick.com/archives/704
  • enumerable 的唯一开销是单个额外的堆分配(一次),然后每次迭代 2 个虚拟调用(MoveNextCurrent)。现在人们必须有一个非常特殊的要求来计算这些东西:)
  • 不管怎样,这是一场学术讨论。您在最初的帖子中写的所有内容都完全适用于File.ReadAllLines,它会预先读取整个文件。
【解决方案2】:

方法一

比方法 2 更冗长。所以事情被塞满的可能性更大。

方法二

更简洁,更直接地封装意图 - 更容易阅读和遵循,也更少塞东西的机会(比如忘记处置阅读器等)。

【讨论】:

  • 正如我在另一个答案中提到的那样,不是的情况。 File.ReadLines 不会将整个文件加载到内存中
  • @Rob 确实你是对的 - 我认为它返回 int[] 而不是 IEnumerabe
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多