Linq to objects - 选择第一个对象

Ori*_*rds 11 c# linq linq-to-objects

我对linq几乎一无所知.

我这样做:

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

这让我获得了符合该标准的所有正在运行的进程.

但我不知道如何获得第一个.我可以在网上找到的例子似乎暗示我必须这样做

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

这对我来说有点难看,如果没有匹配的进程也会抛出异常.有没有更好的办法?

UPDATE

我实际上是想找到第一个匹配的项目,然后打电话SetForegroundWindow给它

我想出了这个解决方案,这也让我感到丑陋和可怕,但比上面更好.有任何想法吗?

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*ton 20

@FryHard FirstOrDefault可以工作,但请记住,如果找不到它,它将返回null.此代码未经过测试,但应接近您的要求:

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

if (app == null)
    return;

SetForegroundWindow(app.MainWindowHandle);
Run Code Online (Sandbox Code Playgroud)

  • @Quintin FirstOrDefault没有"关键字"语法 - 您必须使用扩展方法. (2认同)