2010-01-18 16 views
22

Ich habe eine List<int> und ich möchte es in eine List<double> konvertieren. Gibt es eine Möglichkeit, dies andere zu tun, als nur Schleifen der List<int> und das Hinzufügen zu einem neuen List<double> etwa so:C# Konvertierungsliste <int> zu Liste <double>

List<int> lstInt = new List<int>(new int[] {1,2,3}); 
List<double> lstDouble = new List<double>(lstInt.Count);//Either Count or Length, I don't remember 

for (int i = 0; i < lstInt.Count; i++) 
{ 
    lstDouble.Add(Convert.ToDouble(lstInt[0])); 
} 

Gibt es eine andere Art, dies zu tun? Ich verwende C# 4.0, daher kann die Antwort die neuen Sprachfunktionen nutzen.

+0

(für die Aufzeichnung beachten Sie, dass die C# 4.0-Varianz nicht auf Betontypen arbeiten wird ('List '), wird nicht auf Listen allgemein arbeiten ('IList '), und wird nicht funktionieren zwischen 'int' und 'double') –

Antwort

28

können Sie LINQ Methoden verwenden:

List<double> doubles = integers.Select<int, double>(i => i).ToList(); 

oder:

List<double> doubles = integers.Select(i => (double)i).ToList(); 

Auch hat die Liste Klasse ein Für jede Methode:

List<double> doubles = new List<double>(integers.Count); 
integers.ForEach(i => doubles.Add(i)); 
+0

Dies muss ausgewählt werden (i => i) .ToList(); Gibt es eine Möglichkeit, die <,>-Syntax mit einer "Type" -Variable anstelle von int zu verwenden? – Ames

+1

@Chris: Es wäre eigentlich nur 'Ganzzahlen.Select (i => (Doppel) i)' idiomatisch sein. Aber nein, Generika sind eine Funktion zur Kompilierung - wenn Sie einen Typ verwenden möchten, der nur zur Ausführungszeit bekannt ist, müssen Sie eine Spiegelung verwenden. Dynamisches Tippen in C# 4 könnte Ihnen dabei helfen, aber Sie müssten ein konkreteres Beispiel geben, bevor wir das sicher sagen könnten. –

+0

Mit der zweiten Demo kann ich eine Reflektionsliste vom Typ double erstellen und dann foreach stuff verwenden, um Elemente aus der int-basierten Liste hinzuzufügen. Promotion wird stattfinden und alles wird glücklich passieren. Diese Antwort löste tatsächlich mein Problem, aber die obigen sind prägnanter zu der Frage, die ich gestellt habe. – Ames

8

Sie können dies tun, um die Select Erweiterung Methode:

List<double> doubleList = intList.Select(x => (double)x).ToList(); 
+0

aber immer noch nur eine Schleife unter der Decke, richtig? –

+0

@Mitch Weizen, das ist richtig. –

+0

Also gibt es keinen Grund, nicht nur eine Schleife zu benutzen? Leistung weise? – Ames

49

Sie können Verwendung Select wie von anderen vorgeschlagen, aber Sie auch ConvertAll verwenden können:

List<double> doubleList = intList.ConvertAll(x => (double)x); 

Dies hat zwei Vorteile:

  • Es ist nicht LINQ benötigen, so dass, wenn Sie verwenden .NET 2.0 und möchten LINQBridge nicht verwenden, können Sie es trotzdem verwenden.
  • Es ist effizienter: die ToList Methode kennt nicht die Größe des Ergebnisses von Select, so dass es möglicherweise Puffer neu zuweisen muss, wie es geht. ConvertAll kennt die Quell- und Zielgröße, so dass es alles auf einmal erledigen kann. Dies kann auch ohne Abstraktion von Iteratoren geschehen.

Die Nachteile:

  • Es funktioniert nur mit List<T> und Arrays. Wenn Sie eine einfache IEnumerable<T> erhalten, müssen Sie Select und ToList verwenden.
  • Wenn Sie LINQ stark in Ihrem Projekt verwenden, ist es möglicherweise konsistenter, es auch hier zu verwenden.
+1

und verfügbar in .NET 3.5 sowie –

+0

Ist ConvertAll nicht nur ein Wrapper für den LINQ-Ausdruck? –

+0

Gibt es einen Unterschied zu Select, außer dass es deutlicher Ihre Absicht zeigt? – VVS

0

Sie können Select oder ConvertAll verwenden. Beachten Sie, dass ConvertAll auch verfügbar in .Net 2.0

2

Sie können ConvertAll Methode innerhalb von .Net Framework 2.0 Hier ist ein Beispiel

 List<int> lstInt = new List<int>(new int[] { 1, 2, 3 }); 
     List<double> lstDouble = lstInt.ConvertAll<double>(delegate(int p) 
     { 
      return (double)p; 
     }); 
1

Sie eine Methodengruppe verwenden können:

lstDouble = lstInt.Select(Convert.ToDouble)