2010-06-04 3 views
-2

comment puis-je faire ce pas une boucle?comment puis-je faire ce pas une boucle?

   { 
      ManagementObjectSearcher Vquery = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController"); 
      ManagementObjectCollection Vcoll = Vquery.Get(); 
      foreach (ManagementObject mo in Vcoll) 
      { 
       System.Diagnostics.Process.Start("http://www.google.com/search?hl=en&q=" + mo["name"].ToString()); 
      } 
+6

Quel est le problème avec avoir une boucle? – Giorgi

+0

car il ouvre deux fois la page. – NightsEVil

+3

@NightsEvil - et vous vouliez faire quoi? (en supposant qu'il y ait plusieurs contrôleurs). Si le problème est de plusieurs pages, pourquoi ne pas demander "comment arrêter cette ouverture de plusieurs pages?" –

Répondre

2

est ici un code très stupide pour éviter foreach:

if(Vcoll.Count > 0) 
{ 
    IEnumerator en = collection.GetEnumerator(); 
    en.MoveNext(); 
    System.Diagnostics.Process.Start("http://www.google.com/search?hl=en&q=" + en.Current["name"].ToString()); 
} 

Mais, si le problème est d'ouvrir plusieurs pages, je préfère une simple pause dans le foreach:

foreach (ManagementObject mo in Vcoll) 
{ 
    System.Diagnostics.Process.Start("http://www.google.com/search?hl=en&q=" + mo["name"].ToString()); 
    break; 
} 
+0

totalement ce dont j'avais besoin était une pause; Merci beaucoup! Je me sens un peu retardé ... lol merci de toutes façons – NightsEVil

+2

parfois, tout ce dont vous avez besoin est une pause - sonne comme la sagesse ancienne –

+1

C'est * pas * une utilisation complète/correcte 'IEnumerator'; vous devriez également vérifier 'IDisposable' et appeler' Dispose() '. Ou mieux; il suffit d'utiliser 'foreach' avec' break'. –

0

Il y a quelques (assez inutile) des moyens impliquant des listes et des méthodes telles que ForEach - ou peut-être Select, mais vous n'êtes pas résoudre un problème ici. Utilisez simplement la boucle. Cela exprime parfaitement ce que vous faites.

Une façon hacky (je ne suis pas recommmend ce ici):

Vcoll.Cast<ManagementObject>().Select(mo => 
    System.Diagnostics.Process.Start("http://www.google.com/search?hl=en&q=" 
     + mo["name"].ToString())).ToArray(); 

pas une amélioration de l'OMI.

1

Vous y êtes.

var procs = (from mo in (new ManagementObjectSearcher("SELECT * FROM Win32_VideoController")).Get().OfType<ManagementObject>() 
        select (System.Diagnostics.Process.Start("http://www.google.com/search?hl=en&q=" + mo["name"].ToString()))).ToList(); 
+1

Non; l'exécution dans LINQ est différée. Cela ne fait * rien * que mettre en place la chaîne. –

+0

Droite. changé le code pour une exécution immédiate. –

+0

son pour .net 2.0 – NightsEVil

0

Une seule ligne commune est:

Vcoll.ForEach(mo -> System.Diagnostics.Process.Start("http://www.google.com/search?hl=en&q=" + mo["name"].ToString())); 

Bien sûr ForEach a sa propre boucle à l'intérieur.

0

Si tous vous voulez accomplir n'est pas l'ouverture des pages deux fois, puis utilisez "distinct":

var foundNames = 
    (from ManagementObject mo in new ManagementObjectSearcher("SELECT * FROM Win32_VideoController").Get() 
    let name = mo["Name"].ToString() 
    where !String.IsNullOrEmpty(name) 
    select name).Distinct(); 

foreach(var name in foundNames) 
    Process.Start("http://www.google.com/search?hl=en&q=" + name);