Быстрое преобразование из коллекции в список <T>
Чего я бы хотел избежать:
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);
Ответы
Ответ 1
Какая версия фреймворка? С 3.5 вы могли бы использовать:
List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();
(отредактирован для удаления более простой версии, я проверил и ManagementObjectCollection
только реализует не-общую форму IEnumerable
)
Ответ 2
Вы можете использовать
using System.Linq;
Это даст вам метод ToList < > extension для ICollection < >
Ответ 3
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;
}
}
Ответ 4
Вы можете попробовать:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray());
Не уверен, что для коллекции доступно .ToArray().
Если вы используете код, который вы отправили, убедитесь, что вы инициализируете List с количеством существующих элементов:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count); // or .Length
Ответ 5
Пока ManagementObjectCollection реализует IEnumerable <ManagementObject> вы можете сделать:
List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);
Если это не так, то вы застряли, делая это так, как вы это делаете.
Ответ 6
вы можете конвертировать, как показано ниже фрагмент кода
Collection<A> obj=new Collection<return ListRetunAPI()>
Ответ 7
Начиная с 3.5, все, что унаследовано от System.Collection.IEnumerable, имеет удобный способ расширения OfType.
Если ваша коллекция принадлежит ICollection или IEnumerable, вы можете просто сделать это:
List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();
Невозможно найти способ проще.:)