Verwandeln Sie List <int> in List <string> in .NET 2.0


96

Können Sie werfen ein List<int>zu List<string>irgendwie?

Ich weiß, ich könnte das Ding durchlaufen und .ToString (), aber eine Besetzung wäre großartig.

Ich bin in C # 2.0 (also kein LINQ ).

Antworten:


151

.NET 2.0 verfügt über die ConvertAllMethode, mit der Sie eine Konverterfunktion übergeben können:

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

116

Aktualisiert für 2010

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

6
Vielen Dank! Das hat mir eine
Steve French

2
Nein, Lambdas wurden in C # 3.0 eingeführt, daher funktioniert dies in 2.0 nicht.
Luke

Ich habe festgestellt, dass es mit VS2008 und .NET 2.0 funktioniert, solange Sie mindestens .NET 3.0 installiert haben. siehe stackoverflow.com/questions/3341846/…
igelineau

1
Die Benutzer sollten zwischen der .NET-Version und der C # -Version unterscheiden. Da der Pfeil x => x.ToString()auf dieselbe Art von IL kompiliert ist wie delegate(int x) { return x.ToString(); }in diesem Fall, ist es wichtig, einen C # -Compiler (C # -Version) zu haben, der weiß, was =>ist. Das Framework und die Laufzeit (.NET-Version) benötigen hierfür keine besonderen Funktionen, daher ist .NET 2.0 hier in Ordnung.
Jeppe Stig Nielsen

Es stellt sich heraus, dass Sie Graben können <string>und es funktioniert immer noch. Machen Sie es einfachl1.ConvertAll(x => x.ToString());
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

8

Kann C # 2.0 das List<T>.Convert? Wenn ja, denke ich, wäre Ihre beste Vermutung, dies mit einem Delegierten zu verwenden:

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

Etwas in diese Richtung.


Upvote Glenns Antwort, die wahrscheinlich der richtige Code ist ;-)


6

Sie können verwenden:

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

5

Sie können es nicht direkt umwandeln, da keine explizite oder implizite Umwandlung von int in string vorhanden ist. Es müsste sich um eine Methode handeln, die .ToString () umfasst, z. B.: -

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

Bearbeiten - oder, wie andere ziemlich brillant hervorgehoben haben, verwenden Sie intList.ConvertAll (delegate (int i) {return i.ToString ();}); es ist jedoch klar, dass Sie immer noch .ToString () verwenden müssen und es sich eher um eine Konvertierung als um handelt eine Besetzung.


3
Das Vorhandensein einer Besetzung zwischen den generischen Typen hat nichts mit der Fähigkeit zu tun, zwischen den Projektionen zu gießen. IE, selbst wenn intimplizit oder explizit in konvertierbar wäre string, bedeutet dies nicht, dass List<int>eine implizite oder explizite Konvertierung in erfolgt List<string>.
Adam Robinson

1

Sie müssen eine neue Liste erstellen. Die zugrunde liegenden Bitdarstellungen von List<int>und List<string>sind vollständig inkompatibel - auf einer 64-Bit-Plattform beispielsweise sind die einzelnen Mitglieder nicht einmal gleich groß.

Es ist theoretisch möglich, a List<string>als zu behandeln List<object>- dies führt Sie in die aufregenden Welten der Kovarianz und Kontravarianz und wird derzeit von C # oder VB.NET nicht unterstützt.


@Curt :> Es ist theoretisch möglich,> eine Liste <Zeichenfolge> als Liste <Objekt> zu behandeln -> dies versetzt Sie in die aufregenden Welten> der Kovarianz und Kontravarianz und> wird derzeit von C # oder> VB nicht unterstützt. NET C # und .NET unterstützen tatsächlich Covariance. Nur nicht mit Generika.
Christian Hagelid

1

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

Ersetzen Sie die Parameter result und listOfInt durch Ihre Parameter


Für mich hat richtig funktioniert result = listOfInt.Select (i => i.ToString ()). ToList ();
Sharunas Bielskis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.