2

次の (nunit) テストをパスさせるには、「MagicFunction」の実装はどのようになりますか?

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

8 に答える 8

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

編集:
他の人が指摘したように、改行文字は環境によって異なります。同じ環境で作成されたファイルに対してのみこの関数を使用することを計画している場合は、System.Environment が正常に機能します。ただし、Linux ボックスでファイルを作成し、それを Windows ボックスに転送する場合は、別の種類の改行を指定する必要があります。Linux は \n を使用し、Windows は \r\n を使用するため、このコードは Windows と Linux の両方のファイルで機能します。Mac をミックス (\r) に投入する場合は、もう少し複雑なものを考え出す必要があります。

于 2009-09-23T15:50:20.347 に答える
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());
}
于 2009-09-23T15:52:10.563 に答える
1
var result = "-- " + str.Replace(Environment.NewLine, Environment.NewLine + "-- ");

Windows (\r\n) の NewLines または Unix の NewLines (\n) に対応させたい場合は、次のようにします。

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

\r は元の位置のままなので、触る必要はありません。ただし、Unix と Windows の間を行き来したい場合は、次のようにします。

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

それを実行し、ローカル OS の形式で結果を返します

于 2009-09-23T15:49:32.893 に答える
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();
    }
}
于 2009-09-23T15:52:09.377 に答える
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;
}
于 2009-09-23T15:54:16.613 に答える
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();
}
于 2009-09-23T17:37:36.363 に答える
0

回答ありがとうございます。MagicFunction を拡張メソッドとして実装しました。Thomas Levesque の回答を活用していますが、すべての主要な環境を処理するように強化されており、出力文字列で入力文字列と同じ改行ターミネータを使用する必要があると想定しています。

最高のパフォーマンスだったので、Thomas Levesque の回答を (Spencer Ruport の、Fredrik Mork の、Lazarus、および JDunkerley よりも) 支持しました。パフォーマンス結果はブログに掲載し、興味のある方のために後でここにリンクします。

(当然、'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;
}
于 2009-09-23T19:21:10.407 に答える
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());
}
于 2009-09-23T15:53:05.663 に答える