Can IEnumerable.Select() skip an item?
c#, ienumerable
Solution
No, `Select` always yields one output element for each input element. There's no alternative to that. You could easily write your own `FilteredSelect` extension method - but it's simpler just to use a `Where` clause.
Alternatively, use `Process.GetProcesses()` to get a snapshot of all processes, and then join that to your sessions collection (or use something similar). That would avoid the ugly catch:
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);
Or:
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;
Problem
I have this function: ``` 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; } }); } ``` The try..catch is necessary since there may be sessions with a PID that doesn't exist anymore. I'd like to skip them. Is there a way to do this from the `Select` callback or do I need to add a new `Where` condition that skips `null` values?