Transmitir List <int> a List <string> en .NET 2.0

96

¿Puedes lanzar un List<int>to de List<string>alguna manera?

Sé que podría recorrer y .ToString () la cosa, pero un elenco sería increíble.

Estoy en C # 2.0 (por lo que no LINQ ).

lomaxx
fuente

Respuestas:

151

.NET 2.0 tiene el ConvertAllmétodo en el que puede pasar una función de conversión:

List<int>    l1 = new List<int>(new int[] { 1, 2, 3 } );
List<string> l2 = l1.ConvertAll<string>(delegate(int i) { return i.ToString(); });
Glenn Slaven
fuente
116

Actualizado para 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());
Luke
fuente
6
¡Gracias! Esto me ahorró un montón de tiempo
Steve French
2
No, las lambdas se introdujeron en C # 3.0, por lo que esto no funcionará en 2.0.
Luke
Descubrí que funciona con VS2008 y .NET 2.0, siempre que tenga al menos .NET 3.0 instalado. ver stackoverflow.com/questions/3341846/…
igelineau
1
La gente debería diferenciar entre la versión .NET y la versión C #. Dado que la flecha x => x.ToString()se compila con el mismo tipo de IL que delegate(int x) { return x.ToString(); }en este caso, lo importante es tener un compilador de C # (versión de C #) que sepa qué =>es. El marco y el tiempo de ejecución (versión .NET) no necesitan características especiales para esto, por lo que .NET 2.0 está bien aquí.
Jeppe Stig Nielsen
Resulta que puedes deshacerte <string>y todavía funciona. Haciéndolo justol1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
8

¿C # 2.0 puede hacerlo List<T>.Convert? Si es así, creo que su mejor suposición sería usar eso con un delegado:

List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Convert(delegate (int i) { return i.ToString(); });

Algo en ese sentido.


Vota la respuesta de Glenn, que probablemente sea el código correcto ;-)

Erik van Brakel
fuente
6

Puedes usar:

List<int> items = new List<int>(new int[] { 1,2,3 } );
List<string> s = (from i in items select i.ToString()).ToList();
lutecki
fuente
5

Usted no sería capaz de lanzar directamente ya que no existe conversión explícita o implícita de int a string, sería tiene que ser un método que implica .ToString (), tales como: -

foreach (int i in intList) stringList.Add(i.ToString());

Editar , o como otros han señalado de manera bastante brillante, use intList.ConvertAll (delegate (int i) {return i.ToString ();});, sin embargo, claramente todavía tiene que usar .ToString () y es una conversión en lugar de un molde.

ljs
fuente
3
La existencia de un reparto entre los tipos genéricos no tiene nada que ver con la capacidad de emitir entre las proyecciones. IE, incluso si intfuera implícita o explícitamente convertible a string, eso no significa que List<int>tenga una conversión implícita o explícita a List<string>.
Adam Robinson
1

Tienes que crear una nueva lista. Las representaciones de bits subyacentes de List<int>y List<string>son completamente incompatibles; en una plataforma de 64 bits, por ejemplo, los miembros individuales ni siquiera tienen el mismo tamaño.

En teoría, es posible tratar a List<string>como a List<object>: esto lo lleva a los emocionantes mundos de la covarianza y la contravarianza, y actualmente no es compatible con C # o VB.NET.

Curt Hagenlocher
fuente
@Curt :> Teóricamente es posible tratar> una List <string> como una List <object> -> esto te lleva a los emocionantes mundos> de covarianza y contravarianza, y> actualmente no es compatible con C # o> VB. NET C # y .NET son compatibles con Covariance. Pero no con genéricos.
Christian Hagelid
1

result = listOfInt.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToList()

reemplace el resultado de los parámetros y listOfInt a sus parámetros

Jayant Rajwani
fuente
Para mí funcionó correctamente result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis