2010-11-27 4 views
4

Je fais cela et je me demandais juste que je suis nouveau à tout cela si Linq pouvait être utilisé pour réécrire cela?Comment/pourriez-vous réécrire cela en tant que Linq?

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

Répondre

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

Rappelez-vous, utilisez déclarations pour actions comme tuer un processus. Utilisez LINQ pour requêtes, qui lisent les valeurs sans les modifier.

Mais votre code est parfaitement lisible tel quel. Je ne le changerais pas sans une bonne raison.

+0

J'aimerais pouvoir accepter toutes les réponses! C'est juste moi qui essaie de me faire une idée du monde réel (pour moi). Je trempe mon orteil dans l'eau qu'est Linq! Merci Eric J'ai aimé la simplicité de votre réponse. Merci Ani pour la "méthode Purpose-construite" Je vais l'utiliser dans mon code. et à toutes les autres réponses, je pense que j'ai beaucoup appris de tous. – RTFS

5

Dans la syntaxe de la méthode:

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

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

Dans la syntaxe de requête:

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

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

méthode construite à cet effet:

Il n'a vraiment pas besoin de LINQ ici; il y a déjà la méthode Process.GetProcessesByName pratique:

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

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

+1 pour 'Process.GetProcessesByName', ce qui est probablement la bonne façon de procéder. – Brian

2

Notez que LINQ est pour effectuer des requêtes, la projection et l'agrégation. Vous faites quelque chose avec un effet secondaire ici et LINQ n'est pas approprié pour cela. Donc, je sépare la partie de la requête de la partie secondaire.

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

Il peut se demander si la version LINQified est meilleure et je garderais comme est ou non.

1

IEnumerable ne dispose pas d'une méthode d'extension ForEach de sorte que vous ne pouvez pas complètement réécrire comme LINQ (sauf si vous utilisez votre propre extension ForEach)

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

Réécrire en utilisant une extension 'ForEach' pour obtenir un effet secondaire serait maléfique. – jason

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

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

Je pense que la liste a une ForEach- extension que vous pourriez utiliser.

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