从 ManagementObjectCollection 中的所有对象获取所有非空属性
Get all non null properties from all objects in a ManagementObjectCollection
我正在尝试简化这两个 foreach
循环,但我似乎无法理解。它使用 management
库获取有关 OS 的信息,大约有 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
的东西吗?
您至少需要一个循环,但要避免使用嵌套循环,您可以使用 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>";
}
为什么不直接使用 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;
纯 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>"));
好吧,我并不是说它最简单,而是一种更简单、优雅的想要和可采用的方法来实现结果。
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;
}
如果您知道里面只有 1 件您想要的商品,您可以这样做:
var data = Management.SelectMany(_ => _.Properties).FirstOrDefault(_ => _.Name == "CSName" && _.Value != null);
if (data != null)
TxtBody.Text += "<br><font color = red>" + data.Name + ": " + data.Value + "</font>";
我正在尝试简化这两个 foreach
循环,但我似乎无法理解。它使用 management
库获取有关 OS 的信息,大约有 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
的东西吗?
您至少需要一个循环,但要避免使用嵌套循环,您可以使用 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>";
}
为什么不直接使用 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;
纯 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>"));
好吧,我并不是说它最简单,而是一种更简单、优雅的想要和可采用的方法来实现结果。
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;
}
如果您知道里面只有 1 件您想要的商品,您可以这样做:
var data = Management.SelectMany(_ => _.Properties).FirstOrDefault(_ => _.Name == "CSName" && _.Value != null);
if (data != null)
TxtBody.Text += "<br><font color = red>" + data.Name + ": " + data.Value + "</font>";