【问题标题】:Reading a string line per line in C# [duplicate]在C#中每行读取一个字符串行[重复]
【发布时间】:2011-04-28 17:41:09
【问题描述】:

可能重复:
Easiest way to split a string on newlines in .net?

我正在尝试每行读出并解释一个字符串行。我看了一下 StringReader 类,但我需要找出我什么时候在最后一行。这是我要完成的一些伪代码:

while (!stringReaderObject.atEndOfStream()) {
    interpret(stringReaderObject.readLine());
}

有人知道怎么做吗?

谢谢!

伊万

【问题讨论】:

  • 不是真的重复...两个问题都有不同的解决方案。
  • 这是对我有用的解决方案:private static IEnumerable<string> ReadAllLines(string multiLineString) { if (string.IsNullOrEmpty(multiLineString)) yield break; // Nothing to do using (var reader = new StringReader(multiLineString)) { string line; while ((line = reader.ReadLine()) is object) { yield return line; } } }

标签: c# string


【解决方案1】:

如果你是从一个文件中读取它,这样做会更容易:

foreach(var myString in File.ReadAllLines(pathToFile))
    interpret(myString);

如果您从其他地方(Web 服务类等)获取字符串,则拆分字符串会更简单:

foreach(var myString in entireString.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
    interpret(myString);

【讨论】:

  • 如果他的字符串有 \r\n 新行并且他在 Unix 上怎么办?
  • @SB 那么我敢肯定他会添加“单声道”和“互操作”标签 ;-)
  • 值得一提的是File.ReadLines(.Net 4.0),它返回一个IEnumerable<string>,所以你在读取文件时会得到线条,这有两种更好的方式:1.你没有整行-如果你不需要它,内存中的数组。 2. ReadAllLines 在你得到一行之前读取整个文件,ReadLines 将在读取第一行后立即给你。 (反应更灵敏)。因为他在解释它的每一行上都调用了一个方法,所以他需要ReadLines 而不是ReadAllLines
  • 不适合我。 'string.Split(params char[])' 的最佳重载方法匹配有一些无效参数
  • @ColonelPanic,抱歉这个例子有缺陷。我已经更新了它。希望对您有所帮助。
【解决方案2】:

Dismissile 是正确的:

http://msdn.microsoft.com/en-us/library/system.io.streamreader.endofstream.aspx

while (!reader.EndOfStream) 
{ 
    string line = reader.ReadLine(); 
} 

【讨论】:

    【解决方案3】:

    执行 readLine 时检查 null - 请参阅 docs

    【讨论】:

      【解决方案4】:

      像这样:

      string line;
      while (null != (line = reader.ReadLine()) {
          Process(line);
      }
      

      【讨论】:

      • 没有。像这样:while(true) { string line = reader.ReadLine(); if(line == null) { break; } Process(line); }。那一行代码做得太多了。
      • @Jason - 不是真的。这也是我见过的每个示例中的规范使用模式。
      • @Kev:这就像一个代代相传的坏习惯。
      • @Jason - 不,不是。它简洁且完全可读。你把单一的责任推得太远了。
      • @Kev:因为这与 SRP 无关,所以我不是。这主要是关于可读性,并且在一定程度上是可维护性的。简洁的代码不一定是可读的代码。
      【解决方案5】:

      我不确定您从哪里阅读。如果它来自控制台,您可以检查输入字符串的结尾,如“quit”以表示输入结束

      String input;
      while((input = reader.readLine()) != "quit"){
         // do something
      }
      

      【讨论】:

        【解决方案6】:

        StreamReader 类具有 EndOfStream 属性。你考虑过使用它吗?

        【讨论】:

          猜你喜欢
          • 2011-07-19
          • 1970-01-01
          • 2014-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-07
          • 1970-01-01
          相关资源
          最近更新 更多