67 votes

Le plus rapide Convertir de la collection en liste <T>

Ce que j'aimerais éviter:

 ManagementClass m = new ManagementClass("Win32_LogicalDisk");

ManagementObjectCollection managementObjects = m.GetInstances();

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

foreach(ManagementObject m in managementObjects){

    managementList.Add(m);

}
 

N'y a-t-il pas moyen d'obtenir cette collection dans une liste qui ressemble à quelque chose comme:

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

124voto

Marc Gravell Points 482669

Quelle version du framework? Avec 3.5, vous pouvez probablement utiliser:

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

(modifié pour supprimer la version la plus simple; j'ai vérifié et ManagementObjectCollection implémente uniquement la forme non générique IEnumerable )

3voto

mancaus Points 2266

managementObjects.Cast<ManagementBaseObject>().ToList(); est un bon choix.

Vous pouvez améliorer les performances en pré-initialisant la capacité de la liste:

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

1voto

steffenj Points 3704

Tu pourrais essayer:

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

Pas sûr si .ToArray () est disponible pour la collection. Si vous utilisez le code que vous avez posté, assurez-vous d’initialiser la liste avec le nombre d’éléments existants:

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

0voto

MagicKat Points 5192

Tant que ManagementObjectCollection implémente IEnumerable <ManagementObject>, vous pouvez effectuer les opérations suivantes:

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

Si ce n'est pas le cas, vous êtes coincé à le faire comme vous le faites.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X