Przesyłaj List <int> do List <string> w .NET 2.0

97

Czy możesz jakoś rzucić List<int>na List<string>?

Wiem, że mógłbym przelecieć i .ToString () to coś, ale obsada byłaby niesamowita.

Jestem w C # 2.0 (więc nie ma LINQ ).

lomaxx
źródło

Odpowiedzi:

151

.NET 2.0 ma ConvertAllmetodę, w której można przekazać funkcję konwertera:

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
źródło
117

Zaktualizowano na rok 2010

List<int> l1 = new List<int>(new int[] { 1,2,3 } );
List<string> l2 = l1.ConvertAll<string>(x => x.ToString());
Łukasz
źródło
6
Dzięki! To zaoszczędziło mi mnóstwo czasu
Steve French,
2
Nie, lambdy zostały wprowadzone w C # 3.0, więc to nie zadziała w 2.0.
Luke
Okazało się, że działa z VS2008 i .NET 2.0, o ile masz co najmniej .NET 3.0. patrz stackoverflow.com/questions/3341846/…
igelineau
1
Ludzie powinni rozróżniać między wersją .NET a wersją C #. Ponieważ strzałka x => x.ToString()jest kompilowana do tego samego rodzaju IL, co delegate(int x) { return x.ToString(); }w tym przypadku, ważne jest, aby mieć kompilator C # (wersja C #), który wie, co =>to jest. Framework i środowisko wykonawcze (wersja .NET) nie wymagają do tego żadnych specjalnych funkcji, więc .NET 2.0 jest tutaj w porządku.
Jeppe Stig Nielsen
Okazuje się, że możesz porzucić <string>i nadal działa. Po prostul1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
8

Czy C # 2.0 jest w stanie to zrobić List<T>.Convert? Jeśli tak, myślę, że najlepiej przypuszczać, że użyjesz tego z delegatem:

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

Coś w tym kierunku.


Głosuj za odpowiedzią Glenna, która prawdopodobnie jest poprawnym kodem ;-)

Erik van Brakel
źródło
6

Możesz użyć:

List<int> items = new List<int>(new int[] { 1,2,3 } );
List<string> s = (from i in items select i.ToString()).ToList();
luteckiego
źródło
5

Nie będzie w stanie bezpośrednio rzucić go jako nie istnieje wyraźna lub dorozumiana odlewane z int na ciąg, to mają być Metoda polegająca .ToString () takich jak: -

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

Edytuj - lub, jak inni zauważyli dość genialnie, użyj intList.ConvertAll (delegate (int i) {return i.ToString ();});, jednak wyraźnie nadal musisz używać .ToString () i jest to konwersja zamiast Obsada.

ljs
źródło
3
Istnienie rzutowania między typami rodzajowymi nie ma nic wspólnego z możliwością rzutowania między rzutami. IE, nawet jeśli intbyły niejawnie lub jawnie konwertowane na string, nie oznacza to, że List<int>ma niejawną lub jawną konwersję do List<string>.
Adam Robinson
1

Musisz stworzyć nową listę. Podstawowe reprezentacje bitów List<int>i List<string>są całkowicie niezgodne - na przykład na platformie 64-bitowej poszczególne elementy członkowskie nie są nawet tego samego rozmiaru.

Teoretycznie możliwe jest traktowanie a List<string>jako a List<object>- przenosi Cię to w ekscytujące światy kowariancji i kontrawariancji i nie jest obecnie obsługiwane przez C # ani VB.NET.

Curt Hagenlocher
źródło
@Curt :> Teoretycznie jest możliwe, aby traktować> List <string> jako List <object> -> to przenosi cię do ekscytujących światów> kowariancji i kontrawariancji, a> nie jest obecnie obsługiwany przez C # lub> VB. NET C # i .NET faktycznie obsługują kowariancję. Po prostu nie w przypadku leków generycznych.
Christian Hagelid,
1

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

zamień parametry result i listOfInt na swoje parametry

Jayant Rajwani
źródło
U mnie działało poprawnie result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis