Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从对象集合访问一个对象_C#_Collections_Enumeration - Fatal编程技术网

C# 从对象集合访问一个对象

C# 从对象集合访问一个对象,c#,collections,enumeration,C#,Collections,Enumeration,使用此功能: public bool CheckCallerStatus(string stConsumerName) { SelectQuery selectQuery = new SelectQuery("select ExecutablePath from Win32_Process where name='" + stConsumerName + "'"); using (ManagementObjectSearc

使用此功能:

 public bool CheckCallerStatus(string stConsumerName)
    {
        SelectQuery selectQuery = new SelectQuery("select ExecutablePath from Win32_Process where name='" +
                stConsumerName + "'");
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery))
        {
            ManagementObjectCollection moc = searcher.Get();
            if (moc.Count > 1)
            {
                return true; // OK process is running
            }
            return false;
        }
     }
我可以检查作为
stConsumerName
传入的进程是否是活动进程(我使用
moc.Count>1
而不是
moc.Count>0
,因为我正在从正在观察的进程调用函数,并试图查看除此之外是否还有其他活动进程)。我的流程的每个实例都作为对象存储在
ManagementObjectCollection moc

现在,我想得到这个过程的路径。我相信这些信息存储在
moc
中的一个对象和一个简单的
foreach
中,如下所示:

string stFilePath = Empty.String;
foreach (ManagementObject process in moc)
{
    stFilePath = process["ExecutablePath"].ToString();
}
将返回
路径

如您所见,我将
进程[“ExecutablePath”]
的值存储到
字符串中(而不是存储到
列表或
数组或诸如此类的文件中),因为我只关心第一个进程的路径(我假设
moc
中返回的所有进程都是我的进程[名称足够独特])

我的问题是:如何访问
ManagementObjectCollection
中的任何一个对象?这样我就可以设置
stFilePath=process[“ExecutablePath”]
由于
moc
不支持索引,
moc.First()
moc.Single()
将不起作用


和一个相关问题:ManagementObjectClass有一个方法
GetEnumerable()
。我环顾四周(当然还有MSDN参考资料),但我真的不明白。
GetEnumerable()
是否返回索引集合

可以使用LINQ:
moc.first()
获取第一个对象,或者如果要验证只有一个对象,请使用
moc.Single()

编辑:如果
ManagementObjectCollection
未实现
IEnumerable
,则上述扩展方法确实未实现(但这与indexer不同)。您可以通过以下方式手动实现相同的目标:

var enumerator = moc.GetEnumerator();
if(!enumerator.MoveNext()) throw new Exception("No elements");
ManagementObject obj = (ManagementObject) enumerator.Current;
string stFilePath = obj["ExecutablePath"];

你能在“foreach”中使用“break语句”吗?使用
foreach
获取一个项目,然后使用
break
不是一个好主意,因为
foreach
用于迭代多个项目。在以后尝试维护代码时,这可能会有点混淆。
ManagementObjectCollection
是否实现了
IEnumerable
接口的非通用版本?@Grzenio看起来是这样的。特别是它实现了显式接口:
IEnumerable.GetEnumerator
(返回一个迭代ManagementObjectCollection的IEnumerator。)[“Path”]元素呢?如下所示:
moc.First()[“Path”]
?如果
moc.First()
返回的类型(
ManagementObject
)支持索引(
[]
),则可以工作。@Grzenio它不工作<代码>moc
不支持索引。这就是问题的根源。你能在moc中使用.ToList()吗?@lucasabiledebob-Nope:(