Самое быстрое преобразование из коллекции в список
чего я хотел бы избежать:
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 ответов:
какая версия платформы? С 3.5 вы могли, вероятно, использовать:
List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();
(отредактировано для удаления более простой версии; я проверил и
ManagementObjectCollection
реализует только не универсальныйIEnumerable
форма)
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();
Не могу найти более простой способ. :)