web-dev-qa-db-fra.com

Conversion la plus rapide de la collection à la 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 à ceci: 

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

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 le formulaire non générique IEnumerable)

116
Marc Gravell

Vous pourriez utiliser

using System.Linq;

Cela vous donnera une méthode d’extension ToList <> pour ICollection <>

30
jacobsgriffith

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

Tu pourrais essayer:

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

Vous ne savez pas si .ToArray () est disponible pour la collection . Si vous utilisez le code que vous avez publié, assurez-vous d'initialiser la liste avec le nombre d'éléments existants:

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

Depuis la version 3.5, tout ce qui est hérité de System.Collection.IEnumerable a la méthode d’extension pratique OfType disponible.

Si votre collection provient de ICollection ou IEnumerable, procédez comme suit:

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

Impossible de trouver un moyen plus simple. :)

0
stoto

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.

0
MagicKat