我已经打开了五个notepad.exe。现在我想知道与每个notepad.exe相关的所有进程ID。
我知道我可以通过以下方式检索记事本流程列表:
Process [] processes = Process.GetProcessesByName(“notepad”);
但是现在我想要使用LINQ的那些记事本实例的进程Id的字符串[]。我怎么做?我知道我可以创建string []并使用foreach循环填充字符串[]但我想知道使用LINQ。
答案 0 :(得分:6)
你可以写
var ids = Array.ConvertAll(Process.GetProcessesByName("notepad"), p => p.Id);
这将(略微)快于Select
和ToArray
,因为它不需要调整数组的大小。
如果您可以使用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>