2008-10-09 6 views
55

zur Liste Was ich vermeiden möchte:Schnellste von Sammlung Konvertieren <T>

ManagementClass m = new ManagementClass("Win32_LogicalDisk"); 

ManagementObjectCollection managementObjects = m.GetInstances(); 

List<ManagementObject> managementList = new List<ManagementObject>(); 

foreach(ManagementObject m in managementObjects){ 

    managementList.Add(m); 

} 

eine Art und Weise nicht da ist, dass Sammlung in eine Liste zu erhalten, die so etwas wie folgt aussieht:

List<ManagementObject> managementList = new List<ManagementObjec>(collection_array); 
+0

Bitte sagen Sie uns, welche Rahmenbedingungen, die Sie verwenden, geben wird. 2.0 hat eine andere Lösung als 3.5 – MagicKat

Antwort

105

Welche Version des Frameworks? Mit 3.5 könnten Sie vermutlich verwenden:

List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList(); 

(bearbeitet einfachere Version zu entfernen; ich überprüft und ManagementObjectCollection implementiert nur die nicht-generische IEnumerable Form)

+0

Ihre Besetzung könnte fehlschlagen, Sie benötigen stattdessen ManagementBaseObject. – mancaus

+0

Nicht, wenn wir eine Liste erstellen möchten, tun wir dies nicht. Vielleicht wäre OfType ein vernünftiger Kompromiss? –

+0

Wie man managementobjectcollection in IEnumerable umsetzt > wo propertydata nur Name und Wert ist? – Nisha

1

Sie könnten versuchen:

List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray()); 

Nicht sicher, ob .ToArray() für die Sammlung verfügbar ist. Wenn Sie den Code zu tun verwenden Sie auf dem Laufenden, stellen Sie sicher, dass Sie die Liste mit der Anzahl der vorhandenen Elemente initialisieren:

List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count); // or .Length 
+4

Nein, es gibt keine .ToArray() –

0

Solange Managementobject implementiert IEnumerable <Managementobject> Sie tun können :

List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects); 

Wenn Sie dann nicht, stecken sich die Art und Weise zu tun, dass Sie es tun.

+1

Das Problem ist: es tut nicht; es implementiert nur ICollection, IEnumerable, IDisposable –

+0

@Marc Gravell: Dann ist er fest, es so zu tun, wie er es tut. Das IEnumerable ctor tut grundsätzlich das gleiche. – MagicKat

+0

Nicht mit .NET 3.5, ist er nicht. –

2

managementObjects.Cast<ManagementBaseObject>().ToList(); ist eine gute Wahl.

Sie können die Leistung verbessern, indem sie vor der Initialisierung der Liste Kapazität:


    public static class Helpers 
    { 
     public static List<T> CollectionToList<T>(this System.Collections.ICollection other) 
     { 
      var output = new List<T>(other.Count); 

      output.AddRange(other.Cast<T>()); 

      return output; 
     } 
    } 
+1

In der Realität spart die Vorinitialisierung der Kapazität nicht viel Zeit. Die Liste wird mit einer Verdopplungsstrategie wachsen, so dass sie nicht viele Male neu skalieren muss. Auch weniger Code zum Verwalten. –

+0

(insbesondere im Vergleich zu den Overheads von IEnumeable, und Cast-Iterator-Block ...) –

0

Sie wie unter Code-Schnipsel umwandeln kann

Collection<A> obj=new Collection<return ListRetunAPI()> 
0

Seit 3.5, alles von System.Collection.IEnumerable geerbt hat die bequeme Erweiterungsmethode OfType verfügbar.

Wenn Sie Ihre Sammlung von ICollection oder IEnumerable ist, können Sie dies nur tun:

List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList(); 

keine Möglichkeit einfacher gefunden. :)

+0

[OfType vs Cast] (https://Stackoverflow.com/q/4015930/1997232). – Sinatr

29

könnten Sie

using System.Linq; 

verwenden, dass Sie eine ToList <> Erweiterungsmethode für ICollection <>

+7

Ich stoße ständig auf dieses Problem - "Warum gibt es keine' ToList() '"? .... Google .... DOH! Ich kann mich nie daran erinnern, 'using System.Linq;' – Rick

+0

einzuschließen. Dies sollte wahrscheinlich die akzeptierte Antwort sein. –

+0

Es gibt keine ToList() in ObjectCollection. – joaocarlospf