从ManagementObjectCollection中的所有对象获取所有非null属性

时间:2016-03-12 14:07:15

标签: c# foreach wmi

我试图简化这两个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

这样的东西

5 个答案:

答案 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>"));