¿Cuál es la forma más limpia de crear una lista de valores de cadena separados por comas a partir de un IList<string>
o IEnumerable<string>
?
String.Join(...)
funciona de string[]
manera que puede ser engorroso trabajar cuando tipos como IList<string>
o IEnumerable<string>
no se pueden convertir fácilmente en una matriz de cadenas.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Respuestas:
.NET 4+
Detalle y soluciones Pre .Net 4.0
IEnumerable<string>
se puede convertir en una matriz de cadenas muy fácilmente con LINQ (.NET 3.5):Es bastante fácil escribir el método auxiliar equivalente si necesita:
Entonces llámalo así:
Entonces puedes llamar
string.Join
. Por supuesto, no tiene que usar un método auxiliar:Sin embargo, este último es un poco bocado :)
Es probable que esta sea la forma más sencilla de hacerlo, y también bastante eficaz: hay otras preguntas sobre exactamente cómo es el rendimiento, incluido (pero no limitado a) este .
A partir de .NET 4.0, hay más sobrecargas disponibles
string.Join
, por lo que puede escribir:Mucho más simple :)
fuente
List<T>
hace. ¿Por qué reinventar la rueda?ToList
. Sinstring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
embargo, está bien usarlo .Para su información, la versión .NET 4.0
string.Join()
tiene algunas sobrecargas adicionales , que funcionan enIEnumerable
lugar de solo matrices, incluida una que puede manejar cualquier tipoT
:fuente
str = emps.Select(e => e.SSN).Join(",")
La forma más fácil que puedo ver para hacer esto es usando el
Aggregate
método LINQ :fuente
Func<StringBuilder,string,StringBuider>
. Luego solo llameToString()
al StringBuilder devuelto. Por supuesto, no es tan bonito :)input.Count
debería ser más de 1.Creo que la forma más limpia de crear una lista de valores de cadena separados por comas es simplemente:
Aquí hay un ejemplo completo:
No hay necesidad de hacer una función auxiliar, esto está integrado en .NET 4.0 y superior.
fuente
Comparando por rendimiento, el ganador es "Loop, sb. Añádelo y retrocede". En realidad, "mover enumerable y manual a continuación" es lo mismo (considere stddev).
Código:
https://github.com/dotnet/BenchmarkDotNet fue utilizado
fuente
Como llegué aquí mientras buscaba unirme en una propiedad específica de una lista de objetos (y no en ToString ()), aquí hay una adición a la respuesta aceptada:
fuente
Aquí hay otro método de extensión:
fuente
Llegué un poco tarde a esta discusión, pero esta es mi contribución. Tengo que
IList<Guid> OrderIds
convertirlo en una cadena CSV, pero el siguiente es genérico y funciona sin modificaciones con otros tipos:Corto y dulce, utiliza StringBuilder para construir una nueva cadena, reduce la longitud de StringBuilder en uno para eliminar la última coma y devuelve la cadena CSV.
He actualizado esto para usar múltiples
Append()
's para agregar cadena + coma. De los comentarios de James utilicé Reflector para echar un vistazoStringBuilder.AppendFormat()
. Resulta queAppendFormat()
utiliza un StringBuilder para construir la cadena de formato que lo hace menos eficiente en este contexto que simplemente usar múltiplesAppends()
's.fuente
Algo un poco feo, pero funciona:
Le proporciona un CSV de una Lista después de asignarle el convertidor (en este caso d => d.DivisionID.ToString ("b")).
Hacky pero funciona, ¿podría convertirse en un método de extensión tal vez?
fuente
Así es como lo hice, usando la forma en que lo hice en otros idiomas:
fuente
Necesidad específica cuando debemos rodearnos de ', por ej:
fuente
Tenemos una función de utilidad, algo como esto:
Que se puede usar para unir fácilmente muchas colecciones:
Tenga en cuenta que tenemos el parámetro de colección antes de lambda porque intellisense luego recoge el tipo de colección.
Si ya tiene una enumeración de cadenas, todo lo que necesita hacer es ToArray:
fuente
puede convertir el IList en una matriz usando ToArray y luego ejecutar un comando string.join en la matriz.
fuente
Se pueden convertir fácilmente a una matriz utilizando las extensiones de Linq en .NET 3.5.
fuente
También puede usar algo como lo siguiente después de haberlo convertido a una matriz utilizando uno de los métodos enumerados por otros:
Editar: Aquí hay otro ejemplo
fuente
Acabo de resolver este problema antes de pasar por este artículo. Mi solución es algo como a continuación:
Llamado como:
También podría haberme expresado tan fácilmente como tal y también habría sido más eficiente:
fuente
Mi respuesta es como la solución agregada anterior, pero debería tener menos pila de llamadas, ya que no hay llamadas de delegado explícitas:
Por supuesto, uno puede extender la firma para que sea independiente del delimitador. Realmente no soy fanático de la llamada sb.Remove () y me gustaría refactorizarlo para que sea un bucle while directo sobre un IEnumerable y use MoveNext () para determinar si escribir o no una coma. Voy a jugar y publicar esa solución si me encuentro con ella.
Esto es lo que quería inicialmente:
No se requiere una matriz temporal o almacenamiento de lista y no se requiere
StringBuilder
Remove()
oLength--
piratear.En mi biblioteca de framework hice algunas variaciones en la firma de este método, cada combinación de incluir
delimiter
losconverter
parámetros y con el uso de","
yx.ToString()
como valores predeterminados, respectivamente.fuente
Esperemos que esta sea la forma más simple
fuente
Llegué a esta discusión mientras buscaba un buen método de C # para unir cadenas como se hace con el método MySql
CONCAT_WS()
. Este método difiere delstring.Join()
método en que no agrega el signo separador si las cadenas son NULL o están vacías.solo volverá
Lastname
si el nombre está vacío, mientras quevolverá
strLastname + ", "
en el mismo caso.Deseando el primer comportamiento, escribí los siguientes métodos:
fuente
Escribí algunos métodos de extensión para hacerlo de manera eficiente:
Esto depende de
fuente
Puede usar
.ToArray()
enLists
yIEnumerables
, y luego usarString.Join()
como quisiera.fuente
Si las cadenas que desea unir están en la Lista de objetos, entonces también puede hacer algo como esto:
fuente