gpt4 book ai didi

c# - IEnumerable.Select() 可以跳过一个项目吗?

转载 作者:可可西里 更新时间:2023-11-01 08:04:06 25 4
gpt4 key购买 nike

我有这个功能:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com