C#Concat多行字符串

时间:2018-07-05 14:32:26

标签: c# string concat

我有两个字符串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”表示。

有没有一种更可靠的方法?

5 个答案:

答案 0 :(得分:2)

对于单行解决方案:

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似乎会被忽略,但是如果您觉得安全,可以向Trima添加一个呼叫到b

答案 1 :(得分:0)

Environment.NewLine是与平台无关的替代“ \ r \ n”。

答案 2 :(得分:0)

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#?

答案 3 :(得分:0)

这按您的要求进行:

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
  Hello_World
  Hello_World

答案 4 :(得分:0)

我认为,如果您要加载从不同平台(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 }")
}