Самое быстрое преобразование из коллекции в список


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

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 58

7 ответов:

какая версия платформы? С 3.5 вы могли, вероятно, использовать:

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

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

вы могли бы использовать

using System.Linq;

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

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

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

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

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

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

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

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

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

С 3.5, что унаследовано от System.Коллекция.IEnumerable имеет удобный метод расширения oftype доступны.

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

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

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

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

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