¿Cómo creo una cadena delimitada por comas desde una ArrayList?


83

Estoy almacenando un ArrayList of Ids en un script de procesamiento que quiero escupir como una lista delimitada por comas para la salida al registro de depuración. ¿Hay alguna manera de que pueda obtener esto fácilmente sin recorrer las cosas?

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 mucho más fáciles si lo tienes disponible.


Supongo que, debido a que está usando una ArrayList, ¿está usando .Net 1.0 o .Net 1.1?
kͩeͣmͮpͥ ͩ

Respuestas:


157

Sí, estoy respondiendo mi propia pregunta, pero todavía no lo he encontrado aquí y pensé que esto era algo bastante hábil:

... en VB.NET:

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

...C ª#

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

El único problema con esto es que ArrayList debe tener los elementos almacenados como cadenas si está usando Option Strict para asegurarse de que la conversión se realice correctamente.

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

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

2
Hay otras "trampas". Uno es que esta solución no es tan idiomática como recorrer la lista usted mismo. En segundo lugar, si ToArray atraviesa la colección y Join también lo hace, esto lleva el doble de tiempo que un bucle foreach simple.
Bill the Lizard

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

Si puede considerar usar una List <string> en su lugar, eso tiene un método ToArray () incorporado y elimina los problemas de tipo. Por cierto, typeof (cadena) es preferible a Type.GetType ("System.String").
Jon B

17

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

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

No hay necesidad de acrobacias sofisticadas en las nuevas versiones de framework. Suponiendo una versión no tan moderna, lo siguiente sería lo más fácil:

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

La segunda solución de mspmsp también es un buen enfoque, pero no funciona porque pierde la AddressOfpalabra clave. Además, Convert.ToStringes bastante ineficiente (muchas evaluaciones internas innecesarias) y la Convertclase generalmente no está diseñada de manera muy limpia. Tiendo a evitarlo, especialmente porque es completamente redundante.


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

@Echostorm: ¿dónde digo eso? @Joel: para nada. La mayoría de las veces, llaman a la MS.VB.CS.Conversions.ToStringfunción auxiliar que resulta en una simple ToStringllamada. Pero incluso este método no llamaría directamente y (a diferencia de a través de los operadores de conversión VB).
Konrad Rudolph

16

Algo como:

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

Que básicamente bucles ya sabes ...

EDITAR

qué tal si:

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

Ups .... eso no es correcto ... ¿qué tal: string.Join (",", Array.ConvertAll <objeto, cadena> (a.ToArray (), Convert.ToString));
mspmsp

8

string.Join(" ,", myArrayList.ToArray()); Esto funcionará con .net framework 4.5


2

Aquí hay un ejemplo simple que demuestra la creación de una cadena delimitada por comas usando String.Join () 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());

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

o

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

Actualizando, ya que es extremadamente antiguo. Por supuesto, deberías usar string. Únete ahora. No existía como una opción en el momento de escribir este artículo.


¡Vaya, lo siento mucho! Pasé por alto por completo la etiqueta "C #" en la pregunta y supuse que sus respuestas estaban destinadas a ser un código VB válido. Me avergüenza. Pero mientras estamos quisquillosos: su segunda respuesta agrega un "," adicional al final.
Konrad Rudolph
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.