请考虑以下代码:
private static void WriteProcesses(StreamWriter sw, DateTime d) {
sw.WriteLine("List of processes @ " + d.ToString());
Process[] localAll = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost");
if(localAll.Length > 0) {
for(int i = 0; i < localAll.Length; i++) {
sw.WriteLine(" " + localAll[i].ProcessName);
}
}
}
但是我得到一条红色的波浪线说:
无法将System.Collections.Generic.IEnumerable类型隐式转换为'System.Diagnostics.Process []'。存在显式转换(您是否错过了演员?)
我尝试将数组更改为List但没有工作。
答案 0 :(得分:5)
更改
Process[] localAll = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost");
到
Process[] localAll = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost").ToArray();
Where
返回IEnumerable<Process>
,您可以在其上调用ToArray
转换为Process
类型的数组。
或者,您可以通过IEnumerable<Process>
枚举Where
返回。
var processes = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost");
foreach (Process process in processes) {
sw.WriteLine(" " + process.ProcessName);
}
答案 1 :(得分:2)
我认为你最好只把它作为IEnumerable处理
private static void WriteProcesses(StreamWriter sw, DateTime d) {
sw.WriteLine("List of processes @ " + d.ToString());
var localAll = Process.GetProcesses()
.Where(o => o.ProcessName.ToLower() != "svchost");
foreach(Process process in localAll) {
sw.WriteLine(" " + process.ProcessName);
}
}
答案 2 :(得分:1)
我会像这样重写你的代码:
private static void WriteProcesses(StreamWriter sw, DateTime d) {
sw.WriteLine("List of processes @ " + d.ToString());
var localAll = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost");
foreach(var local in localAll) {
sw.WriteLine(" " + local.ProcessName);
}
}
您的问题来自于Where
返回无法映射到数组的IEnumerable
这一事实。但是你没有必要使用数组,所以我已经把它用掉了。 length
检查只是让代码不那么清晰,所以我也改为foreach
。
答案 3 :(得分:0)
如果您不想使用ToArray(),请将Process []更改为var,然后将鼠标悬停在其上以查看Where语句返回的类型。 (或者只是将鼠标悬停在Where()方法上,这会告诉你同样的事情)
答案 4 :(得分:0)
.Where方法返回IEnumerable,其中T是要过滤的类型。对于此示例,您需要在将集合转换为数组的位置之后调用.ToArray()。