2010-08-02 4 views
0

J'écris une requête Linq juste pour apprendre.Besoin d'aide dans Linq

var result = Process.GetProcesses() 
       .Where(p => p.WorkingSet64 > 20 * 1024 * 1024) 
       .OrderByDescending(p => p.WorkingSet64) 
       .Select(p => new {p.Id,p.ProcessName,p.WorkingSet64 }); 

Je veux itérer pour résultat

foreach(process in result) //error-type or namespace process could not be found. 
      { 
       Console.WriteLine(Process.ProcessName); 
      } 

Je veux itérer pour résultat et imprimer chaque nom de processus sur la console.

Ce que je fais mal.

Répondre

8

vous êtes proche:

foreach (var process in result) { 
    Console.WriteLine(process.ProcessName); 
} 

(. Je suppose que vous avez déclaré ne pas le nom process avant)

Notez également que si vous utilisez processus (avec un petit p) la ligne foreach, vous devez garder le même cas lorsque vous l'utilisez dans la boucle.

+3

Dans ce cas, il n'a pas d'autre choix que d'utiliser var, parce qu'il utilise un type anonyme. – Blorgbeard

+0

@Blorgbeard bon point! – Jon

1

Etes-vous déclaré process avant la boucle? Sinon, vous devriez changer votre for each à

foreach(var process in result) 
{ 
    Console.WriteLine(process.ProcessName); 
} 
+0

Il ne serait pas possible de déclarer 'process', à partir de la requête LINQ, c'est un type anonyme. – Blorgbeard

+0

@Blorgbeard Oui, vous êtes ici – DixonD

+0

et vous avez besoin de changer le premier 'P' dans le WriteLine à 'p' :) –

-1

Vous pouvez également projeter votre requête dans la liste des processus:

List<Process> result = Process.GetProcesses() 
       .Where(p => p.WorkingSet64 > 20 * 1024 * 1024) 
       .OrderByDescending(p => p.WorkingSet64).ToList(); 

foreach(Process process in result) 
{ 
    Console.WriteLine(process.ProcessName); 
} 
+0

Ce sont des objets d'un type anonyme créés dans la partie Select Il n'y a pas de type de processus dans le résultat –

+0

@Rune, Il suggère qu'au lieu de créer un type anonyme, il devrait directement utiliser les objets 'Process' car ils étaient déjà instanciés et contiennent toutes les données dont l'OP a besoin. Aucun problème avec cela. –

+0

@Allon tout d'abord il n'y a nulle part déclaré que le type de retour de Process.GetProcess est du type IEnumerable seulement IEnumerable (tout si je suis d'accord que cela semble raisonnable) et d'autre part OP veut apprendre pour l'aider à comprendre le code qu'il affiche plutôt que de lui donner un code qui ferait peut-être la même chose dans mon monde comme une réponse, mais je voudrais prendre note de votre note et d'accord que peut-être le vote était un peu dur alors je vais refaire –

1

Envisagez d'utiliser la syntaxe de requête de LINQ pour le code terser:

var result = from p in Process.GetProcesses() 
      where p.WorkingSet64 > 20 * 1024 * 1024 
      orderby p.WorkingSet64 descending 
      select new { p.Id, p.ProcessName, p.WorkingSet64 }; 

Ensuite, au lieu d'une boucle, pensez à LINQ pour faire la même chose:

Console.WriteLine(string.Join("\r\n", result.Select(p => p.ProcessName))); 

EDIT: La surcharge de string.Join() utilisée ci-dessus n'a été introduite que dans .NET 4.0. Pour utiliser une surcharge qui est disponible dans les versions antérieures, qui accepte un string[] plutôt qu'une IEnumerable<string>, juste chaîne une .ToArray() après la .Select():

Console.WriteLine(string.Join("\r\n", result.Select(p => p.ProcessName).ToArray())); 
Questions connexes