C # Доступ к объектам управления в ManagementObjectCollection - PullRequest
8 голосов
/ 27 августа 2010

Я пытаюсь получить доступ к ManagementObjects в ManagementObjectCollection без использования оператора foreach, возможно, я что-то упускаю, но не могу понять, как это сделать, мне нужно сделать что-то вроде следующего:

ManagementObjectSearcher query = new ManagementObjectSearcher(
     "select Name, CurrentClockSpeed from Win32_Processor");

ManagementObjectCollection queryCollection = query.Get();

ManagementObject mo = queryCollection[0];

Ответы [ 4 ]

8 голосов
/ 27 августа 2010

ManagementObjectCollection реализует IEnumerable или ICollection, поэтому либо вы должны выполнить итерацию через IEnumerable (т.е. foreach), либо CopyTo массив через ICollection.

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

ManagementObject mo = queryCollection.OfType<ManagementObject>().FirstOrDefault()

OfType<ManagementObject> требуется, поскольку ManagementObjectCollection поддерживает IEnumerable, но не IEnumerable из T .

3 голосов
/ 12 апреля 2013

Вы не можете напрямую вызывать linq из ManagementObjectCollection (ни целочисленный индексатор). Сначала вы должны привести его к IEnumerable:

var queryCollection = from ManagementObject x in query.Get()
                      select x;

var manObj = queryCollection.FirstOrDefault();
1 голос
/ 27 ноября 2013

ManagementObjectCollection не реализует индексаторы, но да, вы можете использовать функцию расширения FirstOrDefault, если вы используете linq, но гики, которые используют .net 3 или более раннюю версию (как я все еще работаю над 1.1), могут использовать следующий код, это стандартный способ Для получения первого элемента из любой коллекции реализован интерфейс IEnumerable.

//TODO: Do the Null and Count Check before following lines
IEnumerator enumerator = collection.GetEnumerator();
enumerator.MoveNext();
ManagementObject mo = (ManagementObject)enumerator.Current;

Ниже приведены два различных способа получения ManagementObject из любого индекса

private ManagementObject GetItem(ManagementObjectCollection collection, int index)
{
            //TODO: do null handling 

            IEnumerator enumerator = collection.GetEnumerator();

            int currentIndex = 0;
            while (enumerator.MoveNext())
            {
                if (currentIndex == index)
                {
                    return enumerator.Current as ManagementObject;
                }

                currentIndex++;
            }

            throw new ArgumentOutOfRangeException("Index out of range");
 }

ИЛИ

private ManagementObject GetItem(ManagementObjectCollection collection, int index)
{
            //TODO: do null handling 

            int currentIndex = 0;
            foreach (ManagementObject mo in collection)
            {
                if (currentIndex == index)
                {
                    return mo;
                }

                currentIndex++;
            }

            throw new ArgumentOutOfRangeException("Index out of range");
 }
0 голосов
/ 27 августа 2010

Возможно, вам не хватает приведения:

ManagementObject mo = (ManagementObject)queryCollection[0];

... поскольку я не думаю, что ManagementObjectCollection является универсальной (и поэтому не имеет типизированного индексатора.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...