2010-08-27 77 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"); 
}