Cast List <int> ke List <string> di .NET 2.0

97

Bisakah Anda mentransmisikan List<int>ke List<string>entah bagaimana?

Saya tahu saya bisa mengulang dan .ToString () hal itu, tetapi pemeran akan luar biasa.

Saya di C # 2.0 (jadi tidak ada LINQ ).

lomaxx
sumber

Jawaban:

151

.NET 2.0 memiliki ConvertAllmetode di mana Anda dapat meneruskan fungsi konverter:

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
sumber
117

Diperbarui untuk 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());
Luke
sumber
6
Terima kasih! Ini menghemat banyak waktu
Steve French
2
Tidak, lambda diperkenalkan di C # 3.0 jadi ini tidak akan bekerja di 2.0.
Luke
Saya menemukan bahwa ini berfungsi dengan VS2008 dan .NET 2.0, selama Anda setidaknya menginstal .NET 3.0. lihat stackoverflow.com/questions/3341846/…
igelineau
1
Orang harus membedakan antara versi .NET dan versi C #. Karena panah x => x.ToString()dikompilasi ke jenis IL yang sama seperti delegate(int x) { return x.ToString(); }dalam kasus ini, yang penting adalah memiliki kompilator C # (versi C #) yang tahu apa =>itu. Kerangka kerja dan runtime (versi .NET) tidak memerlukan fitur khusus untuk ini, jadi .NET 2.0 baik-baik saja di sini.
Jeppe Stig Nielsen
Ternyata Anda bisa membuangnya <string>dan masih berhasil. Membuatnya hanyal1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
8

Apakah C # 2.0 dapat dilakukan List<T>.Convert? Jika demikian, saya pikir tebakan terbaik Anda adalah menggunakannya dengan seorang delegasi:

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

Sesuatu di sepanjang garis itu.


Beri suara positif pada jawaban Glenn, yang mungkin merupakan kode yang benar ;-)

Erik van Brakel
sumber
6

Kamu bisa memakai:

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

Anda tidak akan bisa langsung mentransmisikannya karena tidak ada cast eksplisit atau implisit dari int ke string, itu harus menjadi metode yang melibatkan .ToString () seperti: -

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

Edit - atau seperti yang ditunjukkan orang lain dengan sangat cemerlang, gunakan intList.ConvertAll (delegate (int i) {return i.ToString ();});, namun jelas Anda masih harus menggunakan .ToString () dan ini adalah konversi daripada pemeran.

ljs
sumber
3
Keberadaan cast antara tipe generik tidak ada hubungannya dengan kemampuan cast di antara proyeksi. IE, meskipun intsecara implisit atau eksplisit dapat dikonversi string, itu tidak berarti bahwa List<int>memiliki konversi implisit atau eksplisit ke List<string>.
Adam Robinson
1

Anda harus membuat daftar baru. Representasi bit yang mendasari List<int>dan List<string>sama sekali tidak kompatibel - pada platform 64-bit, misalnya, anggota individu bahkan tidak berukuran sama.

Secara teoritis mungkin untuk memperlakukan a List<string>sebagai List<object>- ini membawa Anda ke dunia kovarians dan kontravarian yang menarik, dan saat ini tidak didukung oleh C # atau VB.NET.

Curt Hagenlocher
sumber
@Curt :> Secara teoritis mungkin untuk memperlakukan> List <string> sebagai List <object> -> ini membawa Anda ke dunia yang menarik> kovarian dan kontravarian, dan> saat ini tidak didukung oleh C # atau> VB. NET C # dan .NET sebenarnya mendukung Kovarian. Tidak dengan obat generik.
Christian Hagelid
1

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

ganti hasil parameter dan listOfInt ke parameter Anda

Jayant Rajwani
sumber
Bagi saya bekerja dengan benar result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis