12

linqについてはほとんど何も知りません。

私はこれをやっています:

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

これにより、その基準に一致するすべての実行中のプロセスが取得されます。

しかし、私は最初のものを取得する方法がわかりません。私がネット上で見つけることができる例は、私がこれをしなければならないことを暗示しているようです

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

これはやや醜い印象を与え、一致するプロセスがない場合は例外をスローします。もっと良い方法はありますか?

アップデート

私は実際に最初に一致するアイテムを見つけて、それを呼び出そうとして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
4

3 に答える 3

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);
于 2008-08-11T04:25:07.333 に答える
2

ICRが言うように使用しないでください。を繰り返して、アイテムの数を計算します。この場合、プロセスが少ないため、パフォーマンスの低下は無視できるかもしれませんが、それに入るのは悪い習慣です。クエリが結果の数のみに関心がある場合にのみ使用してください。ほとんど決して良い考えではありません。Count()Count()IEnumerableCount() Count

FryHardの答えにはいくつかの問題があります。まず、実行が遅れるため、LINQクエリを2回実行することになります。1回は結果の数を取得するため、もう1回はを取得するためFirstOrDefaultです。FirstOrDefault第二に、カウントを確認した後、使用する理由は何もありません。nullを返す可能性があるため、nullをチェックせずに使用しないでください。またはapps.First().MainWindowHandle

var app = apps.FirstOrDefault();

if (app != null)
    SetForegroundWindow(app.MainWindowHandle);

これが、間違いなく、最良の解決策がマークのものである理由です。これは、LINQを使用して必要なものを取得するための最も効率的で安定した方法です。

于 2011-11-18T22:54:00.053 に答える
0

最初の例のアプリがIEnumerableであるとすると、.Countプロパティと.FirstOrDefaultプロパティを使用して、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 );
}
于 2008-08-11T04:20:38.260 に答える