我有这个功能:
public IEnumerable<string> EnumPrograms() {
return dev.AudioSessionManager2.Sessions.AsEnumerable()
.Where(s => s.GetProcessID != 0)
.Select(s => {
try {
return Process.GetProcessById((int)s.GetProcessID).ProcessName;
}
catch (ArgumentException) {
return null;
}
});
}
try..catch 是必需的,因为可能存在具有不再存在的 PID 的 session 。我想跳过它们。有没有办法从 Select
回调中执行此操作,或者我是否需要添加一个新的 Where
条件来跳过 null
值?
最佳答案
不,Select
总是为每个输入元素生成一个输出元素。别无选择。您可以轻松编写自己的 FilteredSelect
扩展方法 - 但仅使用 Where
子句会更简单。
或者,使用 Process.GetProcesses()
获取所有进程的快照,然后将其加入您的 session 集合(或使用类似的东西)。这样可以避免丑陋的陷阱:
var sessionProcessIds = new HashSet<int>(dev.AudioSessionManager2.Sessions
.AsEnumerable()
.Select(x => x.GetProcessId)
.Where(pid => pid != 0));
var processes = Process.GetProcesses();
var sessionProcessNames = processes.Where(p => sessionProcessIds.Contains(p.Id))
.Select(p => p.ProcessName);
或者:
var names = from session in dev.AudioSessionManager2.Sessions.AsEnumerable()
let pid = session.GetProcessId
where pid != 0
join process in Process.GetProcesses() on pid equals process.Id
select process.ProcessName;
关于c# - IEnumerable.Select() 可以跳过一个项目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20453754/