Diffuser List <int> vers List <string> dans .NET 2.0


97

Pouvez-vous lancer un List<int>en List<string>quelque sorte?

Je sais que je pourrais boucler et .ToString () la chose, mais un casting serait génial.

Je suis en C # 2.0 (donc pas de LINQ ).

Réponses:


151

.NET 2.0 a la ConvertAllméthode où vous pouvez passer une fonction de convertisseur:

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

117

Mis à jour pour 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());

6
Merci! Cela m'a fait gagner beaucoup de temps
Steve French

2
Non, les lambdas ont été introduits dans C # 3.0, donc cela ne fonctionnera pas dans 2.0.
Luke

J'ai trouvé que cela fonctionne avec VS2008 et .NET 2.0, tant que vous avez au moins .NET 3.0 installé. voir stackoverflow.com/questions/3341846/…
igelineau

1
Les utilisateurs doivent faire la différence entre la version .NET et la version C #. Puisque la flèche x => x.ToString()est compilée dans le même type d'IL que delegate(int x) { return x.ToString(); }dans ce cas, l'important est d'avoir un compilateur C # (version C #) qui sait ce que =>c'est. Le framework et le runtime (version .NET) n'ont pas besoin de fonctionnalités spéciales pour cela, donc .NET 2.0 convient ici.
Jeppe Stig Nielsen

Il s'avère que vous pouvez abandonner <string>et que cela fonctionne toujours. Faire justel1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8

C # 2.0 est-il capable de faire List<T>.Convert? Si tel est le cas, je pense que votre meilleure estimation serait d'utiliser cela avec un délégué:

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

Quelque chose de ce genre.


Votez la réponse de Glenn, qui est probablement le bon code ;-)


6

Vous pouvez utiliser:

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

5

Vous ne seriez pas en mesure de le convertir directement car aucun cast explicite ou implicite n'existe de int en chaîne, il faudrait que ce soit une méthode impliquant .ToString () telle que: -

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

Edit - ou comme d'autres l'ont souligné assez brillamment, utilisez intList.ConvertAll (delegate (int i) {return i.ToString ();});, cependant il est clair que vous devez toujours utiliser .ToString () et c'est une conversion plutôt que un casting.


3
L'existence d'un cast entre les types génériques n'a rien à voir avec la possibilité de lancer entre les projections. IE, même s'il intétait implicitement ou explicitement convertible en string, cela ne signifie pas qu'il List<int>a une conversion implicite ou explicite en List<string>.
Adam Robinson

1

Vous devez créer une nouvelle liste. Les représentations binaires sous-jacentes de List<int>et List<string>sont complètement incompatibles - sur une plate-forme 64 bits, par exemple, les membres individuels n'ont même pas la même taille.

Il est théoriquement possible de traiter un List<string>comme un List<object>- cela vous fait entrer dans les mondes passionnants de la covariance et de la contravariance, et n'est actuellement pas pris en charge par C # ou VB.NET.


@Curt :> Il est théoriquement possible de traiter> une List <string> comme une List <object> -> cela vous amène dans les mondes passionnants> de la covariance et de la contravariance, et> n'est actuellement pas supporté par C # ou> VB. NET C # et .NET prennent réellement en charge Covariance. Mais pas avec des génériques.
Christian Hagelid le

1

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

remplacez les paramètres result et listOfInt par vos paramètres


Pour moi a fonctionné correctement result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.