我写了一个程序在ListView中对“所有Windows已安装的软件”进行排序,我使用下面的代码来获取所有已安装软件的列表。

string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey))
    {
        foreach (string skName in rk.GetSubKeyNames())
        {
            using (RegistryKey sk = rk.OpenSubKey(skName))
            {
                try
                {
                    string[] row = { sk.GetValue("DisplayName").ToString()};
                    var listViewItem = new ListViewItem(row);
                    lstDisplayHardware.Items.Add(listViewItem);

                }
                catch (Exception ex)
                { }
            }
        }
        label1.Text += " (" + lstDisplayHardware.Items.Count.ToString() + ")";
    }


注意:此代码向我展示了所有已安装的程序,大约有145种情况。

之后,我决定在其名称附近对程序大小进行排序,因此更改了第6行,如下所示:

string[] row = { sk.GetValue("DisplayName").ToString() , sk.GetValue("EstimatedSize").ToString() };


现在的问题是,有94例案件的新结果计数。当我使用此新代码时,我的程序仅显示同时具有DisplayName & EstimatedSize的结果,但是由于某些程序没有EstimatedSize属性,因此它们从结果中省略了,结果的数量从145减少到96。我该怎么办?

最佳答案

GetValue状态的文档


  如果名称/值对在注册表中不存在,则返回null


因此,您应该首先检查null。

var displayName = sk.GetValue("DisplayName");
var size = sk.GetValue("EstimatedSize");

ListViewItem item;
if(displayName != null)
{
    if(size != null)
         item = new ListViewItem(new string [] {displayName.ToString(),
                                                       size.ToString()});
    else
         item = new ListViewItem(new string [] {displayName.ToString()});
    lstDisplayHardware.Items.Add(item);
}




如果您需要检查多个属性..根据您的评论,我建议类似的东西

var stringsToCheck  = new string [] { "DisplayName", "SomethingElse",
                                      "AndSomethingElse" };
List<string> items = new List<string>();

foreach(var s in stringsToCheck)
{
     var val = sk.GetValue(s);
     if(val != null)
         items.Add(val.ToString());
}
var listViewItem = new ListViewItem(items.ToArray());


注意:可能不需要ToArray

10-04 21:35