我怎么能让这不是一个循环?
{
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());
}
答案 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);