C # Concat multiline ciąg

głosy
0

Mam dwa łańcuchy A i B.

string A = @Hello_
Hello_
Hello_;

string B = @World
World
World;

Chcę dodać te dwa ciągi razem z wywołania funkcji, która mogłaby wyglądać tak:

string AB = ConcatMultilineString(A, B)

Funkcja powinna zwrócić:

@Hello_World
Hello_World
Hello_World

Najlepszym sposobem, aby to zrobić dla mnie było podziału struny do tablicy wszystkich linii, a następnie dodanie do siebie wszystkich linii, Dodaj wszystkie linie razem z „\ r \ n”, a następnie odsyłając je. Ale wydaje mi się złe praktyki od mulitple linie nie zawsze są oznaczone symbolem „\ r \ n”.

Czy istnieje sposób, aby to zrobić, co jest bardziej wiarygodne?

Utwórz 05/07/2018 o 13:32
użytkownik
W innych językach...                            


5 odpowiedzi

głosy
0

Environment.NewLine jest niezależne od platformy alternatywę do „\ r \ n”.

Odpowiedział 05/07/2018 o 13:37
źródło użytkownik

głosy
0

Environment.NewLinemoże być pomocne, aby rozwiązać „mulitple linie nie zawsze są oznaczone symbolem "\r\n"” -issue

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

Edytować:

Jeśli nie wiesz, czy wielokrotne linie są oddzielone, jak "\n"i "\r\n"to może pomóc:

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

Puste linie są usuwane. Jeśli nie chcesz tego zastosowania: StringSplitOptions.Nonezamiast.

Zobacz też tutaj: Jak podzielić ciągi na powrót karetki z C #?

Odpowiedział 05/07/2018 o 13:38
źródło użytkownik

głosy
2

Rozwiązania jednym wierszu:

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

Podzieliliśmy się na \nponieważ niezależnie od tego, czy jest to \n\rlub po prostu \n, będzie on zawierał \n. Pozostały \rwydają się być ignorowane, ale można dodać wywołanie Trimdo ai bjeśli czujesz się bezpieczniej dla niego.

Odpowiedział 05/07/2018 o 13:57
źródło użytkownik

głosy
0

To działa jak pytasz:

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

}

wyjścia:

Hello_world
hello_world
hello_world

Odpowiedział 05/07/2018 o 14:09
źródło użytkownik

głosy
0

Myślę, że ogólny sposób jest bardzo możliwe, jeśli będzie załadować ciąg znaków, który jest tworzony z różnych platform (Linux + Mac + Windows) lub nawet uzyskać ciągów zawierających HTML podziały wiersza lub co tak zawsze myślę, że będzie trzeba zdefiniować linię złamać ci siebie.

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 }")
}
Odpowiedział 05/07/2018 o 14:16
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more