2010-11-27 8 views
4

Linq가 이것을 재 작성하는 데 사용할 수 있다면이 모든 것을 처음 접했을뿐입니다. 메서드 구문에서어떻게/이것을 Linq로 다시 쓸 수 있습니까?

private void checkacrobat() 
{ 
    Process[] prs = Process.GetProcesses(); 
    foreach(Process pr in prs) 
    { 
     if(pr.ProcessName == "****ProcessName") 
       pr.Kill(); 
    } 
} 

답변

7
foreach(var process in Process.GetProcesses().Where(p=>p.ProcessName==whatever)) 
    process.Kill(); 

프로세스를 죽이는 등의 행동에 대한 를 사용, 기억하십시오. 쿼리에 LINQ를 사용하면 값을 변경하지 않고 값을 읽을 수 있습니다.

하지만 코드는 그대로 읽을 수 있습니다. 나는 좋은 이유없이 그것을 바꿀 수 없다. (당신이 당신의 자신에 ForEach 확장을 사용하지 않는 한) 완전히

Process[] processes in Process.GetProcesses(); 
foreach(Process pr in processes.Where(p => p.ProcessName == "****ProcessName")) 
{ 
pr.Kill(); 
} 
+0

나는 모든 대답을 받아 들일 수 있었으면 좋겠다! 이것은 실제 세계 (내게는) 예를두고 머리를 맞으려고하는 나다. 나는 Linq 인 물에 내 발가락을 담그고있어! 감사합니다 Eric 나는 당신의 대답의 단순함을 좋아했습니다. "Purpose-built method"에 대한 Ani에게 감사드립니다. 저는 이것을 코드에서 사용할 것입니다. 그리고 다른 모든 대답들에 나는 그들 모두에게서 많은 것을 배웠다고 생각한다. – RTFS

5

:

var processesToBeKilled = Process.GetProcesses() 
           .Where(pr => pr.ProcessName == "****ProcessName"); 

foreach(var process in processesToBeKilled) 
    process.Kill(); 

쿼리 구문에서 :

var processesToBeKilled = from pr in Process.GetProcesses() 
          where pr.ProcessName == "****ProcessName" 
          select pr; 

foreach(var process in processesToBeKilled) 
    process.Kill(); 

특수 제작 방법이

LINQ가 필요 없습니다. 편리한 Process.GetProcessesByName 방법은 이미있다 : LINQ는 쿼리 투사 및 집계를위한 것으로

var processesToBeKilled = Process.GetProcessesByName("****ProcessName"); 

foreach(var process in processesToBeKilled) 
    process.Kill(); 
+1

+1 'Process.GetProcessesByName'에 대해 +1하는 것이 좋습니다. – Brian

2

참고. 여기에 부작용이있는 무언가를하고 있으며 LINQ는 적합하지 않습니다. 따라서 쿼리 부분을 부작용 부분에서 멀리 분리합니다.

private void KillProcessesWithName(string processName) { 
    var processesToKill = Process.GetProcesses() 
           .Where(p => p.ProcessName == processName); 
    foreach(var process in processesToKill) { 
     process.Kill(); 
    } 
} 

LINQified 버전이 더 나은지 여부는 논란의 여지가 있습니다.

1

를 IEnumerable는 foreach는 확장 방법이 없습니다 확장 기능을 사용할 수 있습니다.

Process.GetProcesses().Where(p=>p.ProcessName==whatever).ToList().ForEach(y => y.Kill); 
+0

부작용을 얻기 위해'ForEach' 확장을 사용하여 다시 작성하는 것은 좋지 않습니다. – jason

1
var processes = from process in Process.GetProceeses() 
where process.ProcessName == "****ProcessName" 
select process; 

foreach(var p in processes){ 
    p.Kill() 
} 
1

나는 목록이 ForEach- 있다고 생각 LINQ로 다시 쓸 수 없도록

관련 문제