簡體   English   中英

C#訪問ManagementObjectCollection中的管理對象

[英]C# Accessing management objects in ManagementObjectCollection

我試圖在不使用foreach語句的情況下訪問ManagementObjectCollection中的ManagementObjects,也許我錯過了一些但我無法弄清楚如何做到這一點,我需要做類似以下的事情:

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

ManagementObjectCollection queryCollection = query.Get();

ManagementObject mo = queryCollection[0];

ManagementObjectCollection實現IEnumerable或ICollection,因此要么必須通過IEnumerable(即foreach)迭代它,要么通過ICollection復制到數組。

但是因為它支持IEnumerable,所以你可以使用Linq:

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

OfType<ManagementObject>是必需的,因為ManagementObjectCollection支持IEnumerable而不支持IE的IEnumerable

您不能直接從ManagementObjectCollection(也不是整數索引器)調用linq。 你必須先把它投射到IEnumerable:

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

var manObj = queryCollection.FirstOrDefault();

ManagementObjectCollection沒有實現Indexers,但是如果你使用linq你可以使用FirstOrDefault擴展函數但是使用.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");
 }

你可能錯過了演員:

ManagementObject mo = (ManagementObject)queryCollection[0];

...因為我認為ManagementObjectCollection不是通用的(因此沒有類型化的索引器。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM