C#:如何在字符串中的每一行前加上文本?

C#:如何在字符串中的每一行前加上文本?,c#,string,implementation,C#,String,Implementation,要使以下(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

要使以下(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);
}
如果您想让它处理Windows(\r\n)换行或Unix(\n),则:

无需触摸\r,因为它将留在原来的位置。但是,如果要在Unix和Windows之间进行交叉,请执行以下操作:

var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- ");
将执行此操作并以本地操作系统的格式返回结果

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)中,您必须想出一些更复杂的方法。

您可以这样做:

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

您可以按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());
}
string MagicFunction(字符串前缀、字符串原始字符串)
{
列表前缀=新列表();
foreach(orignalString.Split(new[]{Environment.NewLine},StringSplitOptions.None)中的字符串s)
{
前缀。添加(前缀+s);
}
返回字符串.Join(Environment.NewLine,前缀为.ToArray());
}
那么:

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

这个怎么样。它使用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();
}

谢谢大家的回答。我实现了MagicFunction作为扩展方法。它利用了Thomas Levesque的答案,但得到了增强以处理所有主要环境,并假设您希望输出字符串使用输入字符串的同一换行符

我喜欢托马斯·列夫斯基的答案(胜过斯宾塞·鲁波特、弗雷德里克·莫克、拉扎勒斯和伊杜克利),因为这是表现最好的答案。我将在我的博客上发布性能结果,稍后将链接到这里,供感兴趣的人参考

(显然,“MagicFunctionIO”的函数名应该更改。我使用了“PrependEachLineWith”)


那么“\r”字符呢?或者更好,Environment.NewLine呢。我很确定这就是它的目的。:)@SpencerRuport replace应该是
replace
(坦率地说,建议编辑少于6个字符是不可能的)@wondra-修复!谢谢。@Thomas:Environment.NewLine将使用操作系统的任何换行符字符串。唯一的问题是,如果在unix上解析windows文件,或者反之亦然,是的,这就是我要说的问题。。。在Windows或vice上操作UNIX文件是很常见的。versaI刚刚用“\r\n”(Windows)、“\n”(Linux)和“\r”(Mac)尝试过,它在所有情况下都有效。但是它没有保留原始的新行标记,它总是在输出字符串中使用Environment.NewLine。嗯,有点小错误。即使原始字符串没有换行符,它也总是在字符串末尾添加换行符。您可能需要考虑\r\n-
var lines=str.Split(新字符[]{'\r','\n'},StringSplitOptions.RemoveEmptyEntries)
@Gishu:我用
\r\n
\n
换行符测试了这个方法,它可以同时使用这两种方法。它不能仅与
\r
一起使用。在
\n
上拆分的一个好处是,结果字符串包含与输入相同的样式换行符(即使字符串中的
\r\n
\n
换行符混合使用)。
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());
}
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;
}
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();
}
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;
}