使用LINQ从process []获取string []或进程id

时间:2011-02-07 18:28:30

标签: c# linq string

我已经打开了五个notepad.exe。现在我想知道与每个notepad.exe相关的所有进程ID。

我知道我可以通过以下方式检索记事本流程列表:

Process [] processes = Process.GetProcessesByName(“notepad”);

但是现在我想要使用LINQ的那些记事本实例的进程Id的字符串[]。我怎么做?我知道我可以创建string []并使用foreach循环填充字符串[]但我想知道使用LINQ。

5 个答案:

答案 0 :(得分:6)

你可以写

var ids = Array.ConvertAll(Process.GetProcessesByName("notepad"), p => p.Id);

这将(略微)快于SelectToArray,因为它不需要调整数组的大小。

如果您可以使用IEnumerable<int>代替数组,Select(不含ToArray)会更快。

答案 1 :(得分:4)

您可以使用数组转换而不是LINQ来执行单线程:

int[] processIds = Array.ConvertAll(Process.GetProcessesByName("notepad"), 
                                    p => p.Id);

获取流程ID列表:

Process[] processes = Process.GetProcessesByName("notepad");
var processIdList = processes.Select(p => p.Id).ToList();

要获取数组而不是列表,您可以这样做:

var processIdList = processes.Select(p => p.Id).ToArray();

请注意,流程ID的类型为int。如果你想要一个字符串列表,你可以这样做:

var processIdList = processes.Select(p => p.Id.ToString()).ToArray();

答案 2 :(得分:3)

您可以使用:

Process[] processes = Process.GetProcessesByName("notepad");
string[] ids = processes.Select(p => p.Id.ToString()).ToArray();

但是,我怀疑是否需要将其置于string[]类型中。将Process.Id值保留为整数可能更好:

Process[] processes = Process.GetProcessesByName("notepad");
var ids = processes.Select(p => p.Id);
foreach(int processId in ids)
{
   // Do something with each processId
}

答案 3 :(得分:1)

var ids = Process
    .GetProcessesByName("notepad")
    .Select(process => process.Id)
    .ToArray();

答案 4 :(得分:1)

大多数答案专注于从string []创建Process [] 但是为什么你需要一个阵列呢?

如果你需要做的就是稍后遍历所有项目,你实际上不需要为另一个数组分配内存。相反,请使用IEnumerable<T>返回的Select

var ids = Process
    .GetProcessesByName("notepad")
    .Select(process => process.Id); // returns IEnumerable<int>

foreach (var id in ids)
    DoSomethingWith (id);

您可以采用相同的方式选择字符串表示,也可以投影ids

var stringIds = ids.Select (id => id.ToString ()); // returns IEnumerable<string>