2012-04-24 4 views
2

У меня было требование создать TextWriter для заполнения некоторых данных. Я использовал StringWriter как TextWriter, и бизнес-логика отлично работает.Convert StringWriter to string []

У меня есть техническое требование, которое нельзя изменить, поскольку оно может сломать всех клиентов. Мне нужен массив строк string[] от TextWriter, разделенных линией.

Я пытался с этим, но не получилось:

using System; 
using System.IO; 
using System.Text; 

namespace TextWriterToArrayOfStringsDemo 
{ 
    internal static class Program 
    { 
     private static void Main() 
     { 
      var stringBuilder = new StringBuilder(); 
      using (TextWriter writer = new StringWriter(stringBuilder)) 
      { 
       writer.Write("A"); 
       writer.WriteLine(); 
       writer.Write("B"); 
      } 

      string fullString = stringBuilder.ToString(); 
      string replaced = fullString.Replace('\n', '\r'); 
      string[] arrayOfString = replaced.Split('\r'); 

      // Returns false but should return true 
      Console.WriteLine(arrayOfString.Length == 2); 
     } 
    } 
} 

Любая идея или предложение?

+0

Почему заменить символы конца-строки? Это даст вам два разрыва строки, если он когда-либо генерирует '\ r \ n' (что я был бы удивлен, если бы это сделал). И можете ли вы дать нам более подробную информацию о том, что это производит, т. Е. Что еще не так? – Rup

+0

Дело в том, что writer.NewLine содержит \r\n. Мне нужно получить содержание писателя, разделенное \r\n, и не включать \r или \n. – rcarrillopadron

+0

Ответы Джеффа или Джона - это, вероятно, путь, но простой способ исправить ваш - это «string replace = fullString.Replace (« \ r \ n »,« \ n »);' и 'string [] arrayOfString = replace .Split ('\ n'); ' – Rup

ответ

7

Попробуйте использовать Environment.NewLine расколоть, а не '\n':

 var stringBuilder = new StringBuilder(); 
     using (TextWriter writer = new StringWriter(stringBuilder)) 
     { 
      writer.Write("A"); 
      writer.WriteLine(); 
      writer.Write("B"); 
     } 

     string fullString = stringBuilder.ToString(); 
     string[] newline = new string[] { Environment.NewLine }; 
     string[] arrayOfString = fullString.Split(newline, StringSplitOptions.RemoveEmptyEntries); 

     // Returns false but should return true 
     Console.WriteLine(arrayOfString.Length == 2); 
2

Быстрое исправление было бы использовать Regex раскол:

string[] arrayOfString = 
    System.Text.RegularExpressions.Regex.Split(stringBuilder.ToString(), "\r?\n") 
+0

Я думаю, что это решение более элегантно. Но другой - более чистый и более описательный. Как бы вы назвали '\ r? \ N'? – rcarrillopadron

+0

Это просто шаблон регулярного выражения, который означает по существу «любые 0 или 1 экземпляры \ r, за которыми следует \ n», поэтому он разбивает строку на любом из этих экземпляров. Этот пример необходим только в том случае, если вы не знаете, на какой платформе был создан текстовый файл, поскольку текстовые файлы Linux/Unix будут использовать \ n, а Windows будет использовать \ r \ n для окончаний строк. –