Самое быстрое преобразование из коллекции в список <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);

Сообщите нам, какой фреймворк вы используете. 2.0 имеет другое решение, чем 3.5

MagicKat 09.10.2008 20:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
70
1
139 022
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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.

mancaus 09.10.2008 20:33

Нет, если мы хотим создать List <ManagementObject>, мы этого не делаем. Возможно, OfType <ManagementObject> будет разумным компромиссом?

Marc Gravell 09.10.2008 20:38

как передать managementobjectcollection в IEnumerable <IEnumerable <IPropertyData>>, где данные свойства - это только имя и значение?

Nisha 12.04.2013 14:30

Я предлагаю вам отменить свое редактирование, так как многие люди, оказавшиеся здесь, будут использовать другие коллекции, которые могут поддерживать дженерики.

Basic 02.06.2015 01:07

Пока ManagementObjectCollection реализует IEnumerable <ManagementObject>, вы можете:

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

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

Проблема в том, что это не так; он реализует только ICollection, IEnumerable, IDisposable

Marc Gravell 09.10.2008 20:11

@Marc Gravell: Значит, он застрял в том, чтобы делать это так, как он это делает. IEnumerable <T> ctor в любом случае делает то же самое.

MagicKat 09.10.2008 20:16

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

На самом деле предварительная инициализация емкости не сэкономит вам много времени. Список будет расти со стратегией удвоения, поэтому его не придется много раз изменять. Меньше кода, который нужно поддерживать.

Marc Gravell 09.10.2008 20:16

(особенно по сравнению с накладными расходами IEnumeable и блока итератора Cast ...)

Marc Gravell 09.10.2008 20:16

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

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;

Percy 28.10.2015 20:10

В ObjectCollection нет ToList ().

joaocarlospf 12.09.2016 17:32

Включите dll или используйте другой ответ для приведения

jacobsgriffith 13.09.2016 21:27

Другие вопросы по теме