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 ).

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(); });

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());

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 ;-)


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();

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.


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 :> 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


U mnie działało poprawnie result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.