uso una sintaxis lista framework filtrar ejemplos consultas consulta con buscar anidadas c# linq linq-to-objects

c# - una - Linq a los objetos: seleccione el primer objeto



sintaxis linq c# (3)

No sé casi nada sobre linq.

Estoy haciendo esto:

var apps = from app in Process.GetProcesses() where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero select app;

Lo cual me da todos los procesos en ejecución que coinciden con ese criterio.

Pero no sé cómo obtener el primero. Los ejemplos que puedo encontrar en la red parecen implicar que tengo que hacer esto

var matchedApp = (from app in Process.GetProcesses() where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero select app).First();

lo que me parece algo feo, y también arroja una excepción si no hay procesos coincidentes. ¿Hay una mejor manera?

ACTUALIZAR

En realidad, estoy tratando de encontrar el primer elemento coincidente y llamar a SetForegroundWindow en él

He encontrado esta solución, que también me parece fea y horrible, pero mejor que la anterior. ¿Algunas ideas?

var unused = from app in Process.GetProcesses() where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero select SetForegroundWindow( app.MainWindowHandle ); // side-effects in linq-query is technically bad I guess


Suponiendo que en sus primeras aplicaciones de ejemplo es un IEnumerable, puede hacer uso de las propiedades .Count y .FirstOrDefault para obtener el único elemento que desea pasar a SetForegroundWindow.

var apps = from app in Process.GetProcesses() where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero select app; if (apps.Count > 0) { SetForegroundWindow(apps.FirstOrDefault().MainWindowHandle ); }


@FryHard FirstOrDefault funcionará, pero recuerde que devuelve nulo si no se encuentra ninguno. Este código no está probado, pero debe estar cerca de lo que desea:

var app = Process.GetProcesses().FirstOrDefault(p => p.ProcessName.Contains("MyAppName") && p.MainWindowHandle != IntPtr.Zero); if (app == null) return; SetForegroundWindow(app.MainWindowHandle);


No use Count() como dice ICR. Count() repetirá a través de IEnumerable para descubrir cuántos elementos tiene. En este caso, la penalización de rendimiento puede ser insignificante, ya que no hay muchos procesos, pero es un mal hábito entrar. Solo use Count() cuando su consulta solo esté interesada en la cantidad de resultados. Count casi nunca es una buena idea.

Hay varios problemas con la respuesta de FryHard. En primer lugar, debido a la ejecución retrasada , terminará ejecutando la consulta LINQ dos veces, una para obtener el número de resultados y otra para obtener FirstOrDefault . En segundo lugar, no hay ninguna razón para usar FirstOrDefault después de verificar el recuento. Como puede devolver nulo, nunca debes usarlo sin verificar null. O bien, las apps.First().MainWindowHandle o:

var app = apps.FirstOrDefault(); if (app != null) SetForegroundWindow(app.MainWindowHandle);

Esta es la razón por la que la mejor solución es la de Mark, sin lugar a dudas. Es la forma más eficiente y estable de usar LINQ para obtener lo que desea.