2010-11-27 28 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 for 查詢,即讀取值而不更改它們。

但是你的代碼是完全可讀的,因爲它是。沒有很好的理由,我不會改變它。

+0

我希望我能接受所有的答案!這只是我試圖讓我的頭腦圍繞一個真實世界(對我而言)的例子。我正在將腳趾浸入Linq的水中!謝謝埃裏克我喜歡你答案的簡單。感謝Ani爲「特製的方法」,我將在我的代碼中使用它。以及我認爲我從他們身上學到很多東西的所有其他答案。 – RTFS 2010-11-27 15:28:25

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方法:

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

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

對於`Process.GetProcessesByName`,這可能是正確的做法。 – Brian 2010-11-29 14:40:45

2

注意,LINQ是用於查詢,投影和聚集。你在這裏做了一些副作用,而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擴展方法,所以你不能完全把它改寫爲LINQ(除非你用你自己的ForEach擴展)

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

使用`ForEach`擴展名重寫以獲得副作用將是邪惡的。 – jason 2010-11-27 15:16:34

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

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

我認爲,列表中包含了一個ForEach-您可以使用的擴展名。

Process.GetProcesses().Where(p=>p.ProcessName==whatever).ToList().ForEach(y => y.Kill); 
相關問題