C#访问ManagementObjectCollection中的管理对象

C#访问ManagementObjectCollection中的管理对象,c#,wmi,C#,Wmi,我试图在不使用foreach语句的情况下访问ManagementObjectCollection中的ManagementObjects,可能我遗漏了一些内容,但我不知道如何执行,我需要执行以下操作: ManagementObjectSearcher query = new ManagementObjectSearcher( "select Name, CurrentClockSpeed from Win32_Processor"); ManagementObjectCollectio

我试图在不使用foreach语句的情况下访问ManagementObjectCollection中的ManagementObjects,可能我遗漏了一些内容,但我不知道如何执行,我需要执行以下操作:

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

ManagementObjectCollection queryCollection = query.Get();

ManagementObject mo = queryCollection[0];
实现IEnumerable或ICollection,因此必须通过IEnumerable(ie foreach)对其进行迭代,或者通过ICollection复制到数组

但是,由于它支持IEnumerable,您可以使用Linq:

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

由于ManagementObjectCollection支持IEnumerable,但不支持IEnumerable,因此需要类型为的

您可能缺少强制转换:

ManagementObject mo = (ManagementObject)queryCollection[0];

…因为我认为ManagementObjectCollection不是泛型的(因此没有类型化索引器)。

您不能直接从ManagementObjectCollection(或整数索引器)调用linq。 您必须先将其转换为IEnumerable:

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

var manObj = queryCollection.FirstOrDefault();

ManagementObjectCollection不实现索引器,但如果您使用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");
 }


我需要添加
类型的
<代码>管理对象mo=queryCollection.OfType().First()
我在
ManagementObject
中也看不到
FirstOrDefault()
,只有
的type()。FirstOrDefault()
为我工作对于任何像我一样困惑的人来说,这个答案有一个拼写错误。它应该是:
ManagementObject mo=queryCollection.OfType().FirstOrDefault()
-1对于错误引导,无法使用数组索引访问ManagementObjectCollection。以下是我的错误截图:
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");
 }