2008-08-11 3 views
10

나는 linq에 대해 거의 아무것도 모릅니다.개체에 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를 호출하고있어

UPDATE, 하지만 위보다. 어떤 아이디어? 그 첫 번째 예에서 애플 리케이션을 가정

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 

답변

19

@FryHard FirstOrDefault 작동하지만 아무것도 발견되지 않을 경우 null을 반환 것을 기억합니다. 이 코드는 테스트하지 않고, 당신이 원하는에 가까워 야 : ICR 말한다처럼

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

if (app == null) 
    return; 

SetForegroundWindow(app.MainWindowHandle); 
+0

인 중복입니다. 어떻게이를 확장 메소드가 아닌 쿼리로 넣을 수 있습니까? –

+2

@Quintin FirstOrDefault에 대한 "키워드"구문이 없습니다. 확장 메서드를 사용해야합니다. –

+1

글쎄,'(query) .FirstOrDefault()'를 사용할 수는 있지만, sentax 확장 메소드는 읽기 쉽다. imo –

1

당신이 SetForegroundWindow을 통과 할 단일 항목을 얻을 수있는 .Count 및 .FirstOrDefault 특성을 활용할 수있는 IEnumerable을합니다.

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); 
} 
+1

다른 곳에서는 linq (지연된 실행)의 이점을 제거하고 FirstOrDefault는 카운트가 –

2

하지 사용 Count()를 수행합니다. Count()IEnumerable을 반복하여 얼마나 많은 항목이 있는지 파악합니다. 이 경우 많은 프로세스가 없으므로 성능 패널티가 무시 될 수 있지만 성능이 저하되는 습관이 있습니다. 귀하의 질의에만 개의 결과가 필요한 경우에만 Count()을 사용하십시오.Count은 거의 좋은 아이디어가 아닙니다.

FryHard의 대답에는 몇 가지 문제가 있습니다. 첫째, delayed execution로 인해 LINQ 쿼리를 두 번 실행하고 결과를 얻으려면 한 번, FirstOrDefault을 얻으려면 한 번만 실행하면됩니다. 둘째, 카운트를 확인한 후에 FirstOrDefault을 사용할 이유가 없습니다. null을 돌려 줄 수가 있기 (위해) 때문에, null를 체크하지 않고는 그것을 사용하지 말아주세요. 어느 쪽이든 apps.First().MainWindowHandle 또는

var app = apps.FirstOrDefault(); 

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

이것이 최상의 해결책은 질문이없는 이유입니다. LINQ를 사용하여 원하는 것을 얻을 수있는 가장 효율적이고 안정적인 방법입니다.

관련 문제