2008-10-09 11 views
55

Lo que me gustaría evitar:más rápido Convertir de la colección a la lista <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); 

} 

no hay una manera de conseguir que la recogida en una lista que se ve algo como:

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

favor nos dicen cuál es el marco que está utilizando. 2.0 tiene una solución diferente desde 3.5 – MagicKat

Respuesta

105

Qué versión del marco? Con 3.5 se podría suponer que utilizar:

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

(editado para eliminar versión más simple, he comprobado y ManagementObjectCollection sólo se implementa la no genérico IEnumerable formulario)

+0

Su conversión puede fallar, necesita ManagementBaseObject en su lugar. – mancaus

+0

No si queremos crear una Lista , no lo hacemos. Quizás OfType sería un compromiso razonable? –

+0

cómo convertir managementobjectcollection en IEnumerable > donde propertydata es solo nombre y valor? – Nisha

1

Puede intentar:

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

No estoy seguro si .ToArray() está disponible para la colección. Si utiliza el código que envió, asegúrese de inicializar la lista con el número de elementos existentes:

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

No, no hay .ToArray() –

0

Mientras implementa ManagementObjectCollection IEnumerable <ManagementObject> se puede hacer :

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

Si no es así, entonces estás trabado haciéndolo de la manera que lo estás haciendo.

+1

El problema es: no; solo implementa ICollection, IEnumerable, IDisposable –

+0

@Marc Gravell: Entonces está estancado haciéndolo de la forma en que lo está haciendo. El IEnumerable ctor está haciendo lo mismo básicamente de todos modos. – MagicKat

+0

No con .NET 3.5, no lo es. –

2

managementObjects.Cast<ManagementBaseObject>().ToList(); es una buena opción.

Se podría mejorar el rendimiento de pre-inicialización de la capacidad de la lista:


    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

En realidad, pre-inicializar la capacidad no le ahorrará una gran cantidad de tiempo. La lista crecerá con una estrategia de duplicación, por lo que no tendrá que cambiar el tamaño muchas veces. Menos código para mantener, también. –

+0

(especialmente cuando se compara con los gastos generales de IEnumeable, y el bloque iterador de Cast ...) –

0

se puede convertir, como a continuación fragmento de código

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

Desde 3.5, algo heredado de System.Collection.IEnumerable tiene la conveniente método de extensión OfType disponible.

Si su colección es de ICollection o IEnumerable, sólo se puede hacer esto:

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

, no encontramos un modo más sencillo. :)

+0

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

29

Usted podría utilizar

using System.Linq; 

que le dará un método ToList <> extensión para ICollection <>

+7

constantemente toco este tema: "¿Por qué no hay' ToList() '"? .... Google .... DOH! Parece que nunca me acuerdo de incluir 'using System.Linq;' – Rick

+0

Probablemente esta sea la respuesta aceptada. –

+0

No hay ToList() en ObjectCollection. – joaocarlospf

Cuestiones relacionadas