我如何使这不是一个循环?

时间:2010-06-04 06:41:13

标签: c# .net-2.0

我怎么能让这不是一个循环?

             {
             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());
             }

5 个答案:

答案 0 :(得分:2)

这是一个非常愚蠢的代码,以避免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());
}

但是,如果问题是打开多个页面,我宁愿在foreach中进行简单的中断:

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

答案 1 :(得分:1)

你在这里。

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();

答案 2 :(得分:0)

有一些(相当无意义的)涉及列表和方法的方法,例如ForEach - 或可能Select,但是你没有在这里解决问题。只需使用循环。它完美地表达了你在做什么。

一种hacky方式(我在此推荐):

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

改进IMO。

答案 3 :(得分:0)

常见的单行是:

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

当然ForEach里面有自己的循环。

答案 4 :(得分:0)

如果您要完成的任务不是两次打开页面,那么请使用“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);