Cast List <int> in List <string> in .NET 2.0


96

Puoi lanciare un List<int>a in List<string>qualche modo?

So che potrei passare attraverso e .ToString () la cosa, ma un cast sarebbe fantastico.

Sono in C # 2.0 (quindi niente LINQ ).

Risposte:


151

.NET 2.0 ha il ConvertAllmetodo in cui è possibile passare una funzione di conversione:

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

116

Aggiornato per il 2010

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

6
Grazie! Questo mi ha fatto risparmiare un sacco di tempo
Steve French il

2
No, i lambda sono stati introdotti in C # 3.0 quindi non funzionerà in 2.0.
Luca

Ho scoperto che funziona con VS2008 e .NET 2.0, purché sia ​​installato almeno .NET 3.0. vedi stackoverflow.com/questions/3341846/...
igelineau

1
Le persone dovrebbero distinguere tra la versione .NET e la versione C #. Poiché la freccia x => x.ToString()è compilata con lo stesso tipo di IL delegate(int x) { return x.ToString(); }di questo caso, la cosa importante è avere un compilatore C # (versione C #) che sappia cos'è =>. Il framework e il runtime (versione .NET) non hanno bisogno di funzionalità speciali per questo, quindi .NET 2.0 va bene qui.
Jeppe Stig Nielsen

Si scopre che puoi abbandonare <string>e funziona ancora. Rendendolo solol1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8

C # 2.0 è in grado di fare List<T>.Convert? Se è così, penso che la tua ipotesi migliore sarebbe usarla con un delegato:

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

Qualcosa del genere.


Dai un voto positivo alla risposta di Glenn, che è probabilmente il codice corretto ;-)


6

Puoi usare:

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

5

Non sarebbe in grado di lanciare direttamente come non esiste un cast esplicito o implicito da int a string, sarebbe hanno di essere un metodo che coinvolge .ToString () come ad esempio: -

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

Modifica - o come altri hanno sottolineato in modo piuttosto brillante, usa intList.ConvertAll (delegate (int i) {return i.ToString ();});, tuttavia chiaramente devi ancora usare .ToString () ed è una conversione piuttosto che un cast.


3
L'esistenza di un cast tra i tipi generici non ha nulla a che fare con la capacità di cast tra le proiezioni. IE, anche se intfosse implicitamente o esplicitamente convertibile in string, ciò non significa che List<int>abbia una conversione implicita o esplicita in List<string>.
Adam Robinson,

1

Devi costruire una nuova lista. Le rappresentazioni di bit sottostanti List<int>e List<string>sono completamente incompatibili: su una piattaforma a 64 bit, ad esempio, i singoli membri non hanno nemmeno le stesse dimensioni.

È teoricamente possibile trattare a List<string>come a List<object>: questo ti porta negli entusiasmanti mondi della covarianza e della controvarianza e non è attualmente supportato da C # o VB.NET.


@Curt :> È teoricamente possibile trattare> un List <string> come un List <object> -> questo ti porta nei mondi emozionanti> di covarianza e controvarianza, e> non è attualmente supportato da C # o> VB. NET C # e .NET supportano effettivamente la covarianza. Solo non con i generici.
Christian Hagelid

1

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

sostituire i parametri result e listOfInt con i propri parametri


Per me ha funzionato correttamente result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.