2008-10-31 16 views
42

Esto probablemente tiene una respuesta simple, pero no debe haber tenido suficiente café para averiguarlo por mi cuenta:En C#: Añadir comillas alrededor de cadena en una lista separada por comas de cadenas

Si hubiera delimitado por una coma cadena como:

string list = "Fred,Sam,Mike,Sarah"; 

Cómo obtendría cada elemento y agregue comillas alrededor de él y pegarse de nuevo en una cadena como esta:

string newList = "'Fred','Sam','Mike','Sarah'"; 

Asumo iterar sobre cada uno de ellos sería un buen comienzo , pero Me quedé perplejo después de eso.

Una solución que es feo:

int number = 0; 
string newList = ""; 
foreach (string item in list.Split(new char[] {','})) 
{ 
    if (number > 0) 
    { 
     newList = newList + "," + "'" + item + "'"; 
    } 
    else 
    { 
     newList = "'" + item + "'"; 
    } 
    number++; 
} 
+0

estoy seguro de que alguien tiene una respuesta a esta expresión regular. Creo que esa sería la manera de hacer esto, pero tampoco estoy al tanto de mis expresiones regulares esta mañana ... – Codewerks

+0

No, creo que FOR tiene la solución más simple ... Recuerde, con expresiones regulares, ahora tiene dos problemas . :) http://www.codinghorror.com/blog/archives/001016.html –

Respuesta

69
string s = "A,B,C"; 
string replaced = "'"+s.Replace(",", "','")+"'"; 

Gracias por los comentarios, me había pasado por alto las cotizaciones externas.

.. Por supuesto, si la fuente era una cadena vacía, le desea que las cotizaciones adicionales alrededor de él o no? ¿Y si la entrada fuera un montón de espacios en blanco ...? Es decir, para dar una solución 100% completa, probablemente pediría una lista de pruebas de unidad, pero espero que mi instinto haya respondido a su pregunta principal.

Actualización: Una alternativa basada en LINQ También se ha sugerido (con la ventaja añadida de utilizar String.Format y por lo tanto no tener que preocuparse de líder/cotizaciones de cola):

string list = "Fred,Sam,Mike,Sarah"; 
string newList = string.Join(",", list.Split(',').Select(x => string.Format("'{0}'", x)).ToList()); 
+0

Eso lo simplifica un poco. Uno solo necesitaría agregar comillas al principio y al final de la cadena para terminarla. –

+1

Tendría que agregar comillas simples al principio y al final de la cadena también. – Maxam

+0

Eso le daría "Fred", "Sam", "Mike", "Sarah"; – Codewerks

15
string[] splitList = list.Split(','); 
string newList = "'" + string.Join("','", splitList) + "'"; 
+0

Me gusta por la inteligencia, pero es más difícil de entender (ya que no es tan sencillo) como citar cada cadena y volver a unirme con comas. Bueno de todos modos :) –

+0

Me gusta esta respuesta más que la seleccionada. ¡Gracias! – CleanBold

+0

Creo que de esta manera se obtiene, en algunos casos, una cadena vacía ('') al final de la cadena de salida. Puede que no sea siempre la mejor solución para estos casos. –

20
string[] bits = list.Split(','); // Param arrays are your friend 
for (int i=0; i < bits.Length; i++) 
{ 
    bits[i] = "'" + bits[i] + "'"; 
} 
return string.Join(",", bits); 

O usted podría utilizar LINQ, sobre todo con una versión de string.join que apoya IEnumerable<string> ...

return list.Split(',').Select(x => "'" + x + "'").JoinStrings(","); 

Hay una implementación de JoinStrings en otro lugar en SO ... Voy a echar un vistazo por ello.

EDIT: Bueno, no es del todo las JoinStrings Estaba pensando, así que aquí está:

public static string JoinStrings<T>(this IEnumerable<T> source, 
            string separator) 
{ 
    StringBuilder builder = new StringBuilder(); 
    bool first = true; 
    foreach (T element in source) 
    { 
     if (first) 
     { 
      first = false; 
     } 
     else 
     { 
      builder.Append(separator); 
     } 
     builder.Append(element); 
    } 
    return builder.ToString(); 
} 

Estos días string.Join tiene una sobrecarga genérico en lugar, sin embargo, por lo que sólo podría utilizar:

return string.Join(",", list.Split(',').Select(x => $"'{x}'")); 
+0

Estoy tratando de usar su método y estoy obteniendo 'type parameter declaration debe ser un identificador no un tipo'. Mi clase de extensión está declarada como 'pública clase estática Extensiones'. ¿Podría ser esta la causa? – user919426

+1

@ user919426: No, simplemente se rompió. Lo he arreglado ahora. –

+0

Disculpe la respuesta tardía, pero gracias @Jon Skeet – user919426

2

no puedo escribir código C#, pero este simple código JavaScript es probablemente fácil de adaptar:

var s = "Fred,Sam,Mike,Sarah"; 
alert(s.replace(/\b/g, "'")); 

Simplemente reemplaza los límites (inicio/final de la cadena, transición de caracteres sin puntuación) por comillas simples.

4

Creo que lo más simple sería Split y luego Join.

string nameList = "Fred,Sam,Mike,Sarah"; 
string[] names = nameList.Split(','); 
string quotedNames = "'" + string.Join("','", names) + "'"; 
1
string list = "Fred,Sam,Mike,Sarah"; 

string[] splitList = list.Split(','); 

for (int i = 0; i < splitList.Length; i++) 
    splitList[i] = String.Format("'{0}'", splitList[i]); 

string newList = String.Join(",", splitList); 
0

El C# aplicación de @PhiLho 's solución de expresiones regulares de JavaScript se ve algo como lo siguiente:

Regex regex = new Regex(
    @"\b", 
    RegexOptions.ECMAScript 
    | RegexOptions.Compiled 
    ); 

string list = "Fred,Sam,Mike,Sarah"; 
string newList = regex.Replace(list,"'"); 
+0

Tenga en cuenta que esta solución falla es que los elementos tienen espacios en ellos. En ese caso, la solución for loop comienza a verse mucho más limpia. – bdukes

0

Mi enfoque "menos sofisticada" ... supongo que siempre es bueno practica usar un StringBuilder porque la lista puede ser muy grande.

string list = "Fred,Sam,Mike,Sarah"; 
StringBuilder sb = new StringBuilder(); 

string[] listArray = list.Split(new char[] { ',' }); 

for (int i = 0; i < listArray.Length; i++) 
{ 
    sb.Append("'").Append(listArray[i]).Append("'"); 
    if (i != (listArray.Length - 1)) 
     sb.Append(","); 
} 
string newList = sb.ToString(); 
Console.WriteLine(newList); 
0

¿Va a procesar una gran cantidad de CSV? Si es así, también debería considerar usar una biblioteca para hacer esto. No reinventar la rueda. Lamentablemente, no he encontrado una biblioteca tan simple como la biblioteca CSV de Python, pero he visto FileHelpers (gratis) reviewed at MSDN Magazine y se ve bastante bien. Probablemente haya otras bibliotecas gratuitas disponibles. Sin embargo, todo depende de la cantidad de procesamiento que va a hacer. A menudo crece y crece hasta que te das cuenta de que sería mejor usar una biblioteca.

14

Siguiendo el ejemplo anterior de Jon Skeet, esto es lo que funcionó para mí. Ya tenía un List<String> variable llamada __messages así que esto es lo que hice:

string sep = String.Join(", ", __messages.Select(x => "'" + x + "'")); 
1

Si está utilizando JSON, a raíz de la función ayudaría

var string[] keys = list.Split(','); 
console.log(JSON.stringify(keys)); 
1

Mis Requisitos:

  1. artículos separados usando comas.
  2. Ajustar todos los elementos en la lista entre comillas dobles.
  3. Escape de las comillas dobles existentes en la cadena.
  4. Maneje cadenas nulas para evitar errores.
  5. No se moleste en ajustar cadenas nulas entre comillas dobles.
  6. Terminar con retorno de carro y avance de línea.

    string.Join (",", lCol.Select (s => s == null? Null: ("\" "+ s.Replace (" \ "", "\" \ "") + " \ ""))) + "\ r \ n";

0

Aquí es una solución de C# 6 utilizando cadena de interpolación

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
         .Select(x => $"'{x}'") 
         .ToList()); 

O, si lo prefiere la opción C# 5 con una cuerda.. Formato:

string newList = string.Join(",", list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
         .Select(x => String.Format("'{0}'", x)) 
         .ToList()); 

Usando StringSplitOptions will r Elimina cualquier valor vacío para que no tengas ninguna comilla vacía, si es algo que intentas evitar.

0

he encontrado una nueva solución para este problema

Ato una lista de valores de artículos seleccionados de la red usando linq, después de que añade una cadena delimitada por comas para cada colecciones cadena utilizando string.join() propiedades .

String str1 = String.Empty; 
String str2 = String.Empty;    
//str1 = String.Join(",", values); if you use this method,result "X,Y,Z" 
    str1 =String.Join("'" + "," + "'", values); 
//The result of str1 is "X','Y','Z" 
    str2 = str1.Insert(0, "'").Insert(str1.Length+1, "'"); 
//The result of str2 is 'X','Y','Z' 

Espero que esto sea útil !!!!!!

0

Para los amantes de los métodos de extensión como yo, aquí está:

public static string MethodA(this string[] array, string seperatedCharecter = "|") 
    { 
     return array.Any() ? string.Join(seperatedCharecter, array) : string.Empty; 
    } 

    public static string MethodB(this string[] array, string seperatedChar = "|") 
    { 
     return array.Any() ? MethodA(array.Select(x => $"'{x}'").ToArray(), seperatedChar) : string.Empty; 
    } 
Cuestiones relacionadas