【问题标题】:C# Concat multiline stringC# Concat 多行字符串
【发布时间】:2018-12-14 02:12:53
【问题描述】:

我有两个字符串 A 和 B。

string A = @"Hello_
Hello_
Hello_";

string B = @"World
World
World";

我想将这两个字符串与函数调用相加,如下所示:

string AB = ConcatMultilineString(A, B)

函数应该返回:

@"Hello_World
Hello_World
Hello_World"

对我来说最好的方法是将字符串拆分为行数组,然后将所有行与 "\r\n" 一起添加,然后返回。但这对我来说似乎是不好的做法,因为多行并不总是用“\r\n”表示。

有没有更可靠的方法来做到这一点?

【问题讨论】:

  • 你的问题是how to split line吗?
  • 多行用Environment.NewLine分隔。如果您对硬编码的\r\n 感到不舒服,您可以使用这个特定于平台的常量。您是否需要处理两个字符串可以有不同行数的情况?如果你想避免数组和循环,肯定有一个 LINQ 单线可能。
  • @dlatikay:问题可能比平台特定字符更大。您可以混合使用\r\n(新段落,Word 中的回车)和\n(同一段落中的新行,Word 中的 Shift+Return)。虽然如果字符串实际上是在 OP 的代码中定义的,这不是问题,但我们不知道实际字符串来自哪里。
  • @Flater 这些字符串来自网站上的输入。我不确定是否会发生 \n 和 \r\n 的混合,但我显然更喜欢万无一失的解决方案。
  • @dlatikay 你能链接一个 LINQ 替代品吗?

标签: c# string concat


【解决方案1】:

Environment.NewLine 是与平台无关的替代方案,可替代使用“\r\n”。

【讨论】:

  • 问题可能比平台特定字符更大。您可以混合使用\r\n(新段落,Word 中的回车)和\n(同一段落中的新行,Word 中的 Shift+Return)。虽然如果字符串实际上是在 OP 的代码中定义的,这不是问题,但我们不知道实际字符串来自哪里。
【解决方案2】:

Environment.NewLine 可能有助于解决“"\r\n" 并不总是指示多行”-问题

https://msdn.microsoft.com/de-de/library/system.environment.newline(v=vs.110).aspx

编辑:

如果您不知道多行是否分隔为"\n""\r\n",这可能会有所帮助:

input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);

删除空行。如果您不想这样使用:StringSplitOptions.None

参见此处:How to split strings on carriage return with C#?

【讨论】:

  • 问题可能比平台特定字符更大。您可以混合使用\r\n(新段落,Word 中的回车)和\n(同一段落中的新行,Word 中的 Shift+Return)。虽然如果字符串实际上是在 OP 的代码中定义的,这不是问题,但我们不知道实际字符串来自哪里。
【解决方案3】:

对于单行解决方案:

var output = string.Join(System.Environment.NewLine, A.Split('\n')
                   .Zip(B.Split('\n'), (a,b) => string.Join("", a, b)));

我们拆分\n,因为无论是\n\r 还是只是\n,它都会包含\n。剩下的 \r 似乎被忽略了,但如果您觉得更安全,可以添加对 Trim 的调用以获取 ab

【讨论】:

  • 有些系统使用单独的\r 作为行分隔符。
  • @AndrewMorton 那么你当然可以使用Split(new [] {'\n', '\r'})
  • var output = string.Join(System.Environment.NewLine, A.Split('\n').Zip(B.Split('\n'), (a,b) => string.Join("", a.Trim(), b.Trim()))); 最后效果很好。如果没有额外的修剪,'\r' 仍会保留在字符串中并剪切第一部分。
【解决方案4】:

按照你的要求做:

static string ConcatMultilineString(string a, string b)
{
    string splitOn = "\r\n|\r|\n";
    string[] p = Regex.Split(a, splitOn);
    string[] q = Regex.Split(b, splitOn);

    return string.Join("\r\n", p.Zip(q, (u, v) => u + v));
}

static void Main(string[] args)
{
    string A = "Hello_\rHello_\r\nHello_";
    string B = "World\r\nWorld\nWorld";

    Console.WriteLine(ConcatMultilineString(A, B));

    Console.ReadLine();

}

输出:

Hello_World
你好世界
你好世界

【讨论】:

    【解决方案5】:

    我认为通用方法是非常不可能的,如果您要加载从不同平台(Linux + Mac + Windows)创建的字符串,甚至获取包含 HTML 换行符或其他内容的字符串 我认为您必须自己定义换行符。

    string a = getA();
    string b = getB();
    char[] lineBreakers = {'\r', '\n'};
    char replaceWith = '\n';
    foreach(string lineBreaker in lineBreakers)
    {
        a.Replace(lineBreaker, replaceWith);
        b.Replace(lineBreaker, replaceWith);
    }
    string[] as = a.Split(replaceWith);
    string[] bs = a.Split(replaceWith);
    string newLine = Environment.NewLine; 
    if(as.Length == bs.Length)
    {
        return as.Zip(bs (p, q) => $"{p}{q}{newLine }")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2016-04-09
      相关资源
      最近更新 更多