Frage

Was wäre eine Implementierung von ‚MagicFunction‘ wie folgt aussehen (nunit) Testdurchlauf machen?

public MagicFunction_Should_Prepend_Given_String_To_Each_Line()
{
    var str = @"line1
line2
line3";

    var result = MagicFunction(str, "-- ");

    var expected = @"-- line1
-- line2
-- line3";

    Assert.AreEqual(expected, result);
}
War es hilfreich?

Lösung 8

Danke allen für Ihre Antworten. I implementiert, um die MagicFunction als Erweiterung Methode. Es nutzt Thomas Levesque Antwort aber verbessert alle wichtigen Umgebungen zu handhaben und vorausgesetzt, dass Sie die Ausgabezeichenfolge die gleiche Newline-Terminator der Eingabezeichenfolge verwenden möchten.

Ich favorisierte Thomas Levesque Antwort (über Spencer Ruport der, Fredrik Mork des Lazarus, und JDunkerley), weil es das beste Ergebnis erzielt wurde. Ich werde die Leistungsergebnisse auf meinem Blog veröffentlichen und Link hier später für die Interessenten.

(Offensichtlich ist die Funktion Namen ‚MagicFunctionIO‘ geändert werden sollte. Ich ging mit ‚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;
}

Andere Tipps

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

EDIT:
Wie andere haben darauf hingewiesen, variieren die Zeilenumbrüche zwischen den Umgebungen. Wenn Sie nur planen diese Funktion auf Dateien zu verwenden, die in der gleichen Umgebung erstellt wurden, dann wird System.Environment gut funktionieren. Wenn Sie jedoch eine Datei auf einem Feld Linux erstellen und es dann zu einer Windows-Box übertragen über Sie eine andere Art von Newline angeben mögen. Da Linux verwendet \ n und Windows verwendet \ r \ n dieses Stück Code wird für Windows und Linux-Dateien zu arbeiten. Wenn Sie Macs in die Mischung (\ r) werfen Sie ein wenig mehr mit etwas einfallen lassen.

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

Wie wäre:

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;
}
var result = "-- " + str.Replace(Environment.NewLine, Environment.NewLine + "-- ");

Wenn Sie wollen, dass es fertig mit Windows (\ r \ n) Zeilenumbrüche oder Unix Einsen (\ n) dann:

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

Keine Notwendigkeit, die \ r zu berühren, wie es zu überlassen, wo es vorher war. Wenn Sie jedoch zwischen Unix und Windows überqueren wollen, dann:

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

Wird es tun und das Ergebnis in dem lokalen O Format zurück

Man könnte es so tun:

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();
    }
}

Sie können die Zeichenfolge von Environment.NewLine, aufgeteilt und dann das Präfix zu jedem dieser Zeichenfolge hinzuzufügen, und verbinden sie dann durch 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());
}

Wie wäre es diese. Es verwendet Stringbuilder, falls Sie auf das Voranstellen viele Linien planen.

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top