Самое быстрое преобразование из коллекции в список <T> - PullRequest
65 голосов
/ 09 октября 2008

Чего я бы хотел избежать:

ManagementClass m = new ManagementClass("Win32_LogicalDisk");

ManagementObjectCollection managementObjects = m.GetInstances();

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

foreach(ManagementObject m in managementObjects){

    managementList.Add(m);

}

Нет ли способа поместить эту коллекцию в список, который выглядит примерно так:

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

Ответы [ 7 ]

119 голосов
/ 09 октября 2008

Какая версия фреймворка? С 3.5 вы можете предположительно использовать:

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

(отредактировано для удаления более простой версии; я проверил, а ManagementObjectCollection реализует только неуниверсальную форму IEnumerable)

31 голосов
/ 02 августа 2015

Вы можете использовать

using System.Linq;

Это даст вам метод расширения ToList <> для ICollection <>

2 голосов
/ 09 октября 2008

managementObjects.Cast<ManagementBaseObject>().ToList(); хороший выбор.

Вы можете улучшить производительность, предварительно инициализировав емкость списка:


    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 голос
/ 09 октября 2008

Вы можете попробовать:

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

Не уверен, что .ToArray () доступен для коллекции. Если вы используете код, который вы разместили, убедитесь, что вы инициализируете список с количеством существующих элементов:

List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count);  // or .Length
0 голосов
/ 20 сентября 2012

Начиная с 3.5, все, что унаследовано от System.Collection.IEnumerable, имеет удобный метод расширения OfType.

Если ваша коллекция из ICollection или IEnumerable, вы можете просто сделать это:

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

Не могу найти более простой способ. :)

0 голосов
/ 16 марта 2009

вы можете конвертировать, как показано ниже фрагмент кода

Collection<A> obj=new Collection<return ListRetunAPI()>
0 голосов
/ 09 октября 2008

Пока ManagementObjectCollection реализует IEnumerable , вы можете делать:

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

Если это не так, то вы застряли, делая это так, как вы это делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...