2009-09-23 3 views

ответ

0

Спасибо всем за ваши ответы. Я реализовал MagicFunction как метод расширения. Он использует ответ Томаса Левеска, но он усилен для обработки всех основных сред И предполагает, что вы хотите, чтобы строка вывода использовала один и тот же терминатор новой строки входной строки.

Я отдал предпочтение ответу Томаса Левеска (над Спенсером Рупортом, Фредриком Морком, Лазарем и Дж. Данкерли), потому что он был лучшим исполнителем. Я опубликую результаты работы в своем блоге и свяжусь здесь позже с заинтересованными.

(Очевидно, что имя функции «MagicFunctionIO» должен быть изменен. Я пошел с «PrependEachLineWith»)

public static string MagicFunctionIO(this string self, string prefix) 
{ 
    string terminator = self.GetLineTerminator(); 
    using (StringWriter writer = new StringWriter()) 
    { 
    using (StringReader reader = new StringReader(self)) 
    { 
     bool first = true; 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
     if (!first) 
      writer.Write(terminator); 
     writer.Write(prefix + line); 
     first = false; 
     } 
     return writer.ToString(); 
    } 
    } 
} 

public static string GetLineTerminator(this string self) 
{ 
    if (self.Contains("\r\n")) // windows 
    return "\r\n"; 
    else if (self.Contains("\n")) // unix 
    return "\n"; 
    else if (self.Contains("\r")) // mac 
    return "\r"; 
    else // default, unknown env or no line terminators 
    return Environment.NewLine; 
} 
1
var result = "-- " + str.Replace(Environment.NewLine, Environment.NewLine + "-- "); 

, если вы хотите не справиться с любой ОС Windows (\ г \ п) новая строка или Unix Ones (\ п), то:

var result = "-- " + str.Replace("\n", "\n-- "); 

Нет необходимости прикасаться к \ г как это должен быть оставлен там, где он был раньше. Если же вы хотите, чтобы пересечь между Unix и Windows, а затем:

var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- "); 

будет делать это и возвращает результат в формате локальной ОС в

+0

будет работать только с Windows, стиль маркеров новой строки («\ г \ п») –

+0

@Thomas: Environment.NewLine будет работать с любой строкой новой строки ОС. Единственная проблема заключается в том, что разбор файлов Windows на unix или наоборот – JDunkerley

+0

Да, это проблема, о которой я говорю ... Очень часто используется файл UNIX для Windows или наоборот –

7
string MagicFunction(string str, string prepend) 
{ 
    str = str.Replace("\n", "\n" + prepend); 
    str = prepend + str; 
    return str; 
} 

EDIT:
Как уже отмечалось, символы новой строки различаются между средами. Если вы планируете использовать эту функцию только для файлов, созданных в одной и той же среде, то System.Environment будет работать нормально. Однако, если вы создаете файл в ящике Linux и затем переносите его в окно Windows, вам нужно указать другой тип новой строки. Поскольку Linux использует \ n, а Windows использует \ r \ n, этот фрагмент кода будет работать как для файлов Windows, так и для Linux. Если вы бросаете Mac в микс (\ r), вам придется придумать что-то более активное.

+0

Как насчет символа «\ r»? –

+6

Или даже лучше, как насчет Environment.NewLine.Я почти уверен, что это то, для чего оно есть. :) –

+0

Okidokie. Ред. –

1

Вы могли бы сделать это так:

public string MagicFunction2(string str, string prefix) 
{ 
    bool first = true; 
    using(StringWriter writer = new StringWriter()) 
    using(StringReader reader = new StringReader(str)) 
    { 
     string line; 
     while((line = reader.ReadLine()) != null) 
     { 
      if (!first) 
       writer.WriteLine(); 
      writer.Write(prefix + line); 
      first = false; 
     } 
     return writer.ToString(); 
    } 
} 
+0

Это будет работать со всеми маркерами новой строки? –

+1

Я просто пробовал использовать «\ r \ n» (Windows), «\ n» (Linux) и «\ r» (Mac), он работает во всех случаях. Однако он не сохраняет исходные маркеры новой строки, он всегда использует Environment.NewLine в строке вывода –

+0

Хмм, небольшая ошибка. Он всегда добавляет новую строку в конец строки, даже если исходная строка не указана. –

3
private static string MagicFunction(string str, string prefix) 
{ 
    string[] lines = str.Split(new[] { '\n' }); 
    return string.Join("\n", lines.Select(s => prefix + s).ToArray()); 
} 
+0

задавалось вопросом, как еще никто не LINQed его :) – Gishu

+0

Вам, вероятно, нужно будет указать в \ r \ n - 'var lines = str.Split (new char [] {'\ r ',' \ n '}, StringSplitOptions.RemoveEmptyEntries); ' – Gishu

+0

@Gishu: Я протестировал метод как с' \ r \ n', так и '\ n' linebreaks, и он работает с обоими. Он не работает только с '\ r'. Один потенциал роста с расщеплением только на '\ n' заключается в том, что результирующая строка содержит те же строки, что и входные строки (даже если в строке есть смесь между' \ r \ n' и '\ n' linebreaks. –

0

Вы можете разделить строку на Environment.NewLine, а затем добавить префикс к каждому из этой строки, а затем присоединиться к ним по Environment.NewLine ,

string MagicFunction(string prefix, string orignalString) 
{ 
    List<string> prefixed = new List<string>(); 
    foreach (string s in orignalString.Split(new[]{Environment.NewLine}, StringSplitOptions.None)) 
    { 
     prefixed.Add(prefix + s); 
    } 

    return String.Join(Environment.NewLine, prefixed.ToArray()); 
} 
1

Как насчет:

string MagicFunction(string InputText) { 
    public static Regex regex = new Regex(
      "(^|\\r\\n)", 
     RegexOptions.IgnoreCase 
     | RegexOptions.CultureInvariant 
     | RegexOptions.IgnorePatternWhitespace 
     | RegexOptions.Compiled 
     ); 

    // This is the replacement string 
    public static string regexReplace = 
      "$1-- "; 

    // Replace the matched text in the InputText using the replacement pattern 
    string result = regex.Replace(InputText,regexReplace); 

    return result; 
} 
0

Как об этом. Он использует StringBuilder, если вы планируете добавлять много строк.

string MagicFunction(string input) 
{ 
    StringBuilder sb = new StringBuilder(); 
    StringReader sr = new StringReader(input); 
    string line = null; 

    using(StringReader sr = new StringReader(input)) 
    { 
    while((line = sr.ReadLine()) != null) 
    { 
     sb.Append(String.Concat("-- ", line, System.Environment.NewLine)); 
    } 
    } 
    return sb.ToString(); 
}