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

标签 c# ienumerable

我有这个功能:

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/

相关文章:

c# - 使用 "base"关键字时基类方法中的代码不执行

c# - 在更新面板中回发后,Bootstrap 工具提示消失

c# - 如何在Windows Phone 7 中使用SQLite 数据库?

.net - 如何在循环中从Ienumerable集合中删除对象

visual-studio-2008 - 在 Visual Studio 中使用 yield return 枚举器方法进行调试监视的问题

c# - 正则表达式替换文件链接中的空格

c# - 在 C# 中进行范围查找?

c# - 具有匿名和动态类型抛出错误的方法

c# - 从 List 转换为 IEnumerable 格式

c# - IEnumerable IEnumerator 带或不带 Current moveNext 重置