1

Windows 注册表的SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall键由一组键组成,每个已安装的程序对应一个键。每个程序的键名都被命名为一个明显随机的字符串,这使得查找给定程序的注册表键变得简单易行(不是!)。注册表项的DisplayName值包含程序的名称。我想Dictionary<string, RegistryKey>使用 LINQ 构造一个字典 (),对于每个注册表项,将DisplayName值映射到注册表项本身。关于如何做到这一点的任何建议?

与此同时,我将阅读LINQ,看看是否能找到解决方案——这是我第一次真正考虑使用 LINQ。我在这里发布我的问题,因为我认为这可能是一项中等常见的任务,因此其他人可能会受益。

提示:Microsoft.Win32.Registry是用于访问 Windows 注册表的类。

4

2 回答 2

2

一个不错的 LINQ 示例链接(没有双关语)

http://www.deepakkapoor.net/get-a-list-of-installed-applications-using-linq-and-c/

我会像这样修改你的情况:

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

using (Microsoft.Win32.RegistryKey key = 
    Registry.LocalMachine.OpenSubKey(registryKey))
{
    (from a in key.GetSubKeyNames()
    let r = key.OpenSubKey(a)
    select new
    {
        DisplayName = r.GetValue("DisplayName"),
        RegistryKey = r
    })
  .Where(c => c.DisplayName!= null)
  .ToDictionary(k=>k.DisplayName, v=>v.RegistryKey);
}
于 2012-11-02T17:41:33.300 回答
0

你可以在这些行上写一些东西:

string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
var dict = new Dictionary<string, RegistryKey>();

using(var key = Registry.LocalMachine.OpenSubKey(registryKey))
{
    foreach(string subkeyName in key.GetSubKeyNames())
    {
        using(var subkey = key.OpenSubKey(subkeyName))
        {
            dict.Add(subkey.GetValue("DisplayName"), subkey);
        }
    }
}

或者如果你想使用 LINQ:

string registryKey = 
    @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
var dict = new Dictionary<string, RegistryKey>();

  using (var key = Registry.LocalMachine.OpenSubKey(registryKey))
  {
    var query = from a in
    key.GetSubKeyNames()
    let r = key.OpenSubKey(a)
    select new
      {
        displayName = r.GetValue("DisplayName")
        subKey = r
      };

    foreach (var item in query)
    {
       dict.Add(item.displayName, item.subKey);
    }
  }
于 2012-11-02T17:20:27.193 回答