2010-08-27 46 views
5

我想在不使用foreach語句的情況下訪問ManagementObjectCollection中的ManagementObjects,也許我錯過了一些東西,但我無法弄清楚如何去做,我需要做類似下面的事情:C#訪問ManagementObjectCollection中的管理對象

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

ManagementObjectCollection queryCollection = query.Get(); 

ManagementObject mo = queryCollection[0]; 

回答

3

ManagementObjectCollection實現IEnumerable或ICollection的,所以無論是你必須通過的IEnumerable(即的foreach)或經由CopyTo從ICollection的陣列迭代它。

然而,因爲它支持IEnumerable的,你可以使用LINQ:

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

OfType<ManagementObject>是必需的,因爲ManagementObjectCollection支持了IEnumerable但不是IEnumerable of T

+1

我需要添加'OfType' ...'的ManagementObject月= queryCollection.OfType <

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

以下是兩種不同的方式從任何索引檢索的ManagementObject ManagementObject>()。First();' – 2014-11-14 03:21:12

+1

我沒有在'ManagementObject'中看到FirstOrDefault(),只有'OfType ()。FirstOrDefault()'爲我工作 – Jack 2016-04-25 19:30:15

+0

對於任何和我一樣困惑,在這個答案中有一個錯字。它應該爲:ManagementObject mo = queryCollection.OfType ()。FirstOrDefault()' – SGS 2017-06-01 14:58:11

0

你可能缺少投:(。,因此不具有類型化索引)

ManagementObject mo = (ManagementObject)queryCollection[0]; 

...因爲我不認爲ManagementObjectCollection是通用

+0

-1用於導致錯誤,無法通過數組索引訪問ManagementObjectCollection。以下是我的錯誤截圖:https://i.imgur.com/FBVXeA2.png – Katianie 2017-11-07 20:33:03

3

你不能直接從ManagementObjectCollection(也不是整數索引器)調用linq。 你必須先將其轉換爲IEnumerable的:

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

var manObj = queryCollection.FirstOrDefault(); 
1

ManagementObjectCollection沒有實現索引器,不過是你可以你,如果你正在使用LINQ,但誰使用.NET 3或更早版本(比如我仍然怪才FirstOrDefault擴展功能在1.1上工作)可以使用以下代碼,它是從任何集合實現的IEnumerable接口獲取第一項的標準方式。

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

OR

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