Чего бы я хотел избежать:
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);
Вы можете попробовать:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.ToArray());
Не уверен, что для коллекции доступен .ToArray (). Если вы все же используете опубликованный код, убедитесь, что вы инициализировали список с количеством существующих элементов:
List<ManagementObject> managementList = new List<ManagementObject>(managementObjects.Count); // or .Length
Какая версия фреймворка? С 3.5 вы, вероятно, могли бы использовать:
List<ManagementObject> managementList = managementObjects.Cast<ManagementObject>().ToList();
(отредактировано для удаления более простой версии; я проверил, и ManagementObjectCollection
реализует только неуниверсальную форму IEnumerable
)
Ваше приведение может выйти из строя, вместо этого вам понадобится ManagementBaseObject.
Нет, если мы хотим создать List <ManagementObject>, мы этого не делаем. Возможно, OfType <ManagementObject> будет разумным компромиссом?
как передать managementobjectcollection в IEnumerable <IEnumerable <IPropertyData>>, где данные свойства - это только имя и значение?
Я предлагаю вам отменить свое редактирование, так как многие люди, оказавшиеся здесь, будут использовать другие коллекции, которые могут поддерживать дженерики.
Пока ManagementObjectCollection реализует IEnumerable <ManagementObject>, вы можете:
List<ManagementObject> managementList = new List<ManagementObjec>(managementObjects);
Если это не так, значит, вы застряли в том, чтобы делать это так, как вы это делаете.
Проблема в том, что это не так; он реализует только ICollection, IEnumerable, IDisposable
@Marc Gravell: Значит, он застрял в том, чтобы делать это так, как он это делает. IEnumerable <T> ctor в любом случае делает то же самое.
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;
}
}
На самом деле предварительная инициализация емкости не сэкономит вам много времени. Список будет расти со стратегией удвоения, поэтому его не придется много раз изменять. Меньше кода, который нужно поддерживать.
(особенно по сравнению с накладными расходами IEnumeable и блока итератора Cast ...)
вы можете преобразовать, как показано ниже, фрагмент кода
Collection<A> obj=new Collection<return ListRetunAPI()>
Начиная с версии 3.5, все, что унаследовано от System.Collection.IEnumerable, имеет удобный метод расширения OfType.
Если ваша коллекция из ICollection или IEnumerable, вы можете просто сделать это:
List<ManagementObject> managementList = ManagementObjectCollection.OfType<ManagementObject>().ToList();
Не могу найти более простого пути. :)
Вы могли бы использовать
using System.Linq;
Это даст вам метод расширения ToList <> для ICollection <>
Постоянно наталкиваюсь на этот вопрос - «Почему нет ToList()
»? .... Google .... DOH! Я никогда не могу вспомнить, чтобы включить using System.Linq;
В ObjectCollection нет ToList ().
Включите dll или используйте другой ответ для приведения
Сообщите нам, какой фреймворк вы используете. 2.0 имеет другое решение, чем 3.5