2011-08-05 36 views
10

Necesito una forma de insertar una coma después de cada carácter en una cadena. Así, por ejemplo, si tengo la cadena de letrasInsertar una coma después de cada carácter en C#

"ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

necesito para que así sea hay una coma después de cada letra de la A, a la Z, me gustaría mantener la cadena como es y no conviértalo en una matriz de caracteres o algo así. No sé si eso es posible, pero es algo que simplemente se debe evitar.

¿Cómo puedo hacer esto? resultado final debe ser la siguiente:

"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," 

Gracias

+0

puede evitar una matriz o un StringBuilder o algo similar porque las cadenas son de solo lectura. ¿Por qué evitar que sean amigos? –

+0

puede no puede –

Respuesta

21

En .Net 4:

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

.Net 4.0 añade una sobrecarga de String.Join que toma un IEnumerable<T>.
Este código lo llama con String a IEnumerable<char>.

Necesito especificar explícitamente el parámetro de tipo genérico o llamará a la sobrecarga params string[] (usando un solo string) en su lugar.

14

Bueno, tienes que hacer algo para generar la nueva cadena. El enfoque más sencillo sería probablemente en .NET 4:

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

o

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

O en .NET 3.5, donde the overload we want no existe:

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

Si esto aren' t lo suficientemente eficiente para usted, siempre puede hacerlo manualmente:

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

+1, el último método (manual uno) hace 10000000 veces en 3727 ms, mientras que el 'String.Join (", ", str)' toma 10543 ms –

+0

+1 amor por stringbuilder! – aevanko

1

Una sustitución de expresiones regulares podría funcionar. La expresión regular podría ser simple como ([A-Z]), y hacer un reemplazo con el partido más el,. Tendría que buscar cómo hacerlo.

Ver aquí, 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()); 
} 

Este string.Join sobrecarga sólo existe en .NET 4.0; si está utilizando una versión anterior, puede hacerlo en su lugar:

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

se puede utilizar un bucle y mover Char Char por entonces se puede añadir el carbón actual a un StringBuilder y añadir la coma también.

después de completar el ciclo, devuelva StringBuilder.ToString() o asígnelo a la variable de cadena original, si no es necesario que lo mantenga igual que antes.

0

Esto debería funcionar

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

Sé que no quería arrays de char pero ¿cómo es esto para una solución a corto:

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

Aquí, consigan unas accumulator wisdom:

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

Es menos legible que .Join pero mucho más flexible.

+0

'String.Concat (str.Select (c => c +", "))' es mucho más rápido. Él quiere las comillas finales. – SLaks

Cuestiones relacionadas