我试图简化这两个foreach
循环但我似乎无法得到它。它使用management
库来获取有关操作系统的信息,有大约30种不同的项目,但我只想要一个。目前我正在滚动它们并在弹出时显示我想要的那个。
try
{
ManagementClass Management = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject Object in Management.GetInstances())
{
foreach (PropertyData Data in Object.Properties)
{
if (Data.Name.Equals("CSName") && (Data.Value != null))
{
TxtBody.Text += "<br><font color = red>" + Data.Name + ": " + Data.Value + "</font>";
}
}
}
}
当然,我可以放一些像TxtBody.text += Management.PropertyData.CSName
答案 0 :(得分:4)
为什么不使用the indexer:
foreach (ManagementObject Object in Management.GetInstances())
{
var value = Object["CSName"];
if (value == null)
continue;
TxtBody.Text += "<br><font color = red>" + "CSName" + ": " + value + "</font>";
}
你也可以使用一些LINQ和String.Join来避免循环:
var propName = "CSName";
var keyValues = Management
.GetInstances()
.Cast<ManagementObject>()
.Select(obj =>
new
{
name = propName,
value = obj[propName]
})
.Where(obj =>
obj.value != null);
var result =
String.Join(
"",
keyValues
.Select(kv =>
String.Format("<br><font color = red>{0} : {1} </font>", kv.name, kv.value)));
TxtBox.Text += result;
答案 1 :(得分:0)
您至少需要一个循环,但为了避免使用嵌套循环,您可以使用LINQ。
您可以像这样使用LINQ:
foreach (PropertyData Data in Management.GetInstances()
.SelectMany(Object => Object.Properties
.Where(Data => Data.Name.Equals("CSName")
&& (Data.Value != null))))
{
TxtBody.Text += "<br><font color = red>" + Data.Name + ": " + Data.Value + "</font>";
}
答案 2 :(得分:0)
嗯,我并不是说它是最简单的,而是一种更简单,更优雅的想法和可采用的方法来实现结果。
foreach (var pValue in management.GetInstances().Cast<ManagementObject>()
.Select(managementObject => managementObject.Properties.Cast<PropertyData>()
.FirstOrDefault(p => p.Name == "CSName"))
.Where(pValue => pValue != null))
{
TxtBody.Text += "<br><font color = red>" + pValue.Name + ": " + pValue.Value + "</font>";
break;
}
答案 3 :(得分:0)
如果您知道在那里只有一个项目,您可以这样做:
var data = Management.SelectMany(_ => _.Properties).FirstOrDefault(_ => _.Name == "CSName" && _.Value != null);
if (data != null)
TxtBody.Text += "<br><font color = red>" + data.Name + ": " + data.Value + "</font>";
答案 4 :(得分:-1)
纯粹的LINQ解决方案:
new ManagementClass("Win32_OperatingSystem").GetInstances().ToList()
.ForEach(instance => instance.Properties
.Where(property => property.Name.Equals("CSName") && property.Value != null).ToList()
.ForEach(property => TxtBody.Text += "<br><font color = red>" + property.Name + ": " + property.Value + "</font>"));