2011-08-05 15 views
10

Potrzebuję sposobu na wstawienie przecinka po każdym znaku w ciągu znaków. Tak na przykład, jeśli mam ciąg literWstawianie przecinka po każdym znaku C#

"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

muszę zrobić to tak nie jest przecinek po każdym list od A do Z, chciałbym zachować ciąg jak to jest i nie przekształcić go w tablicę znaków lub coś w tym stylu. Nie wiem, czy to możliwe, ale jest to po prostu coś, czego chciałbym uniknąć.

Jak mogę to zrobić? Wynik końcowy powinien być tak:

"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z," 

Dzięki

+0

można uniknąć tablicy lub StringBuilder lub coś podobnego, ponieważ łańcuchy są tylko do odczytu. Po co więc unikać, to są przyjaciele! –

+0

może być nie może –

Odpowiedz

21

w .NET 4:

str = String.Join<char>(",", str) + ","; 

.Net 4.0 dodaje String.Join przeciążenie, że trwa IEnumerable<T>.
Ten kod wywołuje go pod numerem String odlanym do IEnumerable<char>.

Potrzebuję jawnie określić ogólny parametr typu lub będzie on wywoływał przeciążenie params string[] (używając pojedynczego).

14

Cóż musisz zrobić coś, aby wygenerować nowy ciąg. Najprostsze podejście byłoby prawdopodobnie w .NET 4:

// string.Join won't put the trailing comma 
string result = string.Join(",", (IEnumerable<char>) input) + ","; 

lub

string result = string.Join<char>(",", input) + ","; 

Albo w .NET 3.5, gdzie the overload we want nie istnieje:

// string.Join won't put the trailing comma 
string result = string.Join(",", input.Select(c => c.ToString()) 
             .ToArray()) + ","; 

Jeśli te aren” Na tyle wydajna, że ​​możesz to zrobić ręcznie: zawsze możesz zrobić to ręcznie:

StringBuilder builder = new StringBuilder(input.Length * 2); 
foreach (char c in input) 
{ 
    builder.Append(c); 
    builder.Append(','); 
} 
string result = builder.ToString(); 
+1

+1, ostatnia metoda (ręczna) robi 10000000 razy w 3727 ms, podczas gdy 'String.Join (", ", str)' trwa 10543 ms –

+0

+1 miłość do konstruktora taśm! – aevanko

1

Może zastąpić wyrażenie regularne. Wyrażenia regularne mogą być proste jako ([A-Z]) i zastąpić je dopasowaniem plus. Musiałbym sprawdzić, jak to zrobić.

Zobacz tutaj, http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx.

Dim input As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    Dim pattern As String = "([A-Z])" 
    Dim replacement As String = "$1," 
    Dim rgx As New Regex(pattern) 
    Dim result As String = rgx.Replace(input, replacement) 
2
string InsertCommasBetweenChars(string s) 
{ 
    return string.Join(",", s.ToCharArray()); 
} 

tylko ten string.Join przeciążenie występuje w .NET 4.0; Jeśli korzystasz ze starszej wersji, można to zrobić w zamian:

string InsertCommasBetweenChars(string s) 
{ 
    return string.Join(",", Array.ConvertAll(s.ToCharArray(), c => c.ToString())); 
} 
0

można użyć pętli for i przenieść char przez char następnie można dołączyć aktualny char do StringBuilder i dodać przecinek dobrze.

po zakończeniu pętli zwracasz wartość StringBuilder.ToString() lub przypisujesz ją do oryginalnej zmiennej łańcuchowej, jeśli nie chcesz jej również zachować tak, jak poprzednio.

0

To powinno działać

var input = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
var result= String.Join(",", input.ToCharArray(0,input.Length)); 
0

Wiem, że nie chcesz char tablic, ale jak to jest na krótką fix:

Console.WriteLine(string.Join(",", "abc".ToCharArray())); 
0

Tutaj zdobędą accumulator wisdom:

var result = "ABCDEFG".Aggregate("", (c, n) => c+ ("," + n)).Substring(1); 

Jest mniej czytelny niż .Join, ale znacznie bardziej elastyczny.

+0

'String.Concat (str.Select (c => c +", "))' jest znacznie szybszy. On chce mieć ciągnące przecinki. – SLaks

Powiązane problemy