2008-10-17 24 views
66

Estoy almacenando una ArrayList de Ids en un script de procesamiento que quiero escupir como una lista delimitada por comas para el resultado del registro de depuración. ¿Hay alguna manera de que pueda obtener esto fácilmente sin pasar por las cosas?¿Cómo creo una cadena delimitada por comas de una ArrayList?

EDITAR: Gracias a Joel por señalar la lista (de T) que está disponible en .net 2.0 y superior. Eso hace que las cosas sean más fáciles si lo tienes disponible.

+0

supongo, porque estás usando una ArrayList, estás usando .Net 1.0 o .Net 1.1? –

+0

http: // stackoverflow.com/questions/799446/creating-a-comma-separated-list-from-iliststring-or-ienumerablestring –

Respuesta

122

Sí, estoy respondiendo a mi propia pregunta, pero no he encontrado aquí todavía y que esto era una cosa bastante resbaladiza:

... en VB.NET:

String.Join(",", CType(TargetArrayList.ToArray(Type.GetType("System.String")), String())) 

... en C#

string.Join(",", (string[])TargetArrayList.ToArray(Type.GetType("System.String"))) 

la única "Gotcha" a éstos es que el ArrayList debe tener los elementos almacenados como cadenas si está utilizando la opción estricto para asegurarse de que la conversión se lleva a cabo correctamente.

EDITAR: Si está utilizando .net 2.0 o superior, simplemente cree un objeto de tipo List (Of String) y podrá obtener lo que necesite. ¡Muchas gracias a Joel por mencionar esto!

String.Join(",", TargetList.ToArray()) 
+1

Existen otros "errores". Una de las razones es que esta solución no es tan idiomática como pasar por la lista usted mismo. En segundo lugar, si ToArray atraviesa la colección y Join también, esto lleva el doble de tiempo que un bucle foreach simple. –

+0

Por supuesto, siempre existe la posibilidad de utilizar System.Collections.Specialized.StringCollection. – ICR

+0

Si puede considerar el uso de una lista en su lugar, que tiene incorporado un método ToArray() y elimina los problemas de tipo. BTW - typeof (cadena) es preferible a Type.GetType ("System.String"). –

15

Algo así como:

String.Join(",", myArrayList.toArray(string.GetType())); 

Lo que básicamente bucles ya saben ...

EDITAR

¿qué tal:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString)); 
+0

oops .... eso no está bien ... qué tal: string.Join (",", Array.ConvertAll (a.ToArray(), Convert.ToString)); – mspmsp

0
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString() 

o

string.Concat(foo.ToArray().Select(a => a += ",").ToArray()) 
+0

Ambas soluciones tienen varios defectos y simplemente no son buenas. –

+0

¡Guau, lo siento mucho! Pasé por alto completamente la etiqueta "C#" en la pregunta y supuse que tus respuestas estaban destinadas a ser un código VB válido. Me avergüenza. Pero a pesar de que estamos pecando: su segunda respuesta agrega un "," adicional al final. –

17

Las soluciones hasta ahora son todos bastante complicado. La solución idiomática debería sin duda ser:

String.Join(",", x.Cast(Of String)().ToArray()) 

No hay necesidad de acrobacias extravagantes en las nuevas versiones de marcos. Suponiendo una versión no tan moderno, el siguiente sería más fácil: segunda solución

Console.WriteLine(String.Join(",", CType(x.ToArray(GetType(String)), String()))) 

de mspmsp es un enfoque muy bien, pero que no funciona porque no alcanza la palabra clave AddressOf. Además, Convert.ToString es bastante ineficaz (muchas evaluaciones internas innecesarias) y la clase Convert generalmente no está muy bien diseñada. Tiendo a evitarlo, especialmente porque es completamente redundante.

+0

¿No son CType y CStr esencialmente llamadas a la clase Convert? –

+0

@Echostorm: ¿dónde digo eso? @Joel: en absoluto. La mayoría de las veces, llaman a la función auxiliar 'MS.VB.CS.Conversions.ToString' que da como resultado una simple llamada' ToString'. Pero incluso este método no llamaría * direct * y (a diferencia de a través de los operadores de transmisión de VB). –

0

Aquí está un ejemplo sencillo que demuestra la creación de una cadena separada por comas utilizando string.join() a partir de una lista de cadenas:

List<string> histList = new List<string>(); 
histList.Add(dt.ToString("MM/dd/yyyy::HH:mm:ss.ffff")); 
histList.Add(Index.ToString()); 
/*arValue is array of Singles */ 
foreach (Single s in arValue) 
{ 
    histList.Add(s.ToString()); 
} 
String HistLine = String.Join(",", histList.ToArray()); 
3

string.Join(" ,", myArrayList.ToArray()); Esto funciona con .NET Framework 4.5

Cuestiones relacionadas