LINQ toDictionary是空的

时间:2013-06-05 12:37:39

标签: c# linq dictionary

有人可以向我解释我做错了什么以及为什么这不起作用?我只是试图从注册表项中获取值,并将它们作为字典返回到main函数。

    public Dictionary<string, string> ListPrograms()
    {
        ///List<object> Apps = new List<object>();
        Dictionary<string, string> Apps = new Dictionary<string, string>();
        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.GetValue("UninstallString")
                    })
                .Distinct()
                .OrderBy(c => c.DisplayName)
                .Where(c => c.DisplayName != null && c.RegistryKey != null)
                .ToDictionary(k => k.RegistryKey.ToString(), v => v.DisplayName.ToString());
        } 
        return Apps;
    }

检索字典后,我将其绑定到列表框。

        listBox1.DisplayMember = "Value";
        listBox1.ValueMember = "Key";
        listBox1.DataSource = new BindingSource(u.ListPrograms(), null);

但是,我的列表框始终为空。有没有更有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:5)

您的代码

In Line (from a in key.GetSubKeyNames()

将其更改为

Apps = (from a in key.GetSubKeyNames()
                let r = key.OpenSubKey(a)
                select new
                {
                    DisplayName = r.GetValue("DisplayName"),
                    RegistryKey = r.GetValue("UninstallString")
                })
            .Distinct()
            .OrderBy(c => c.DisplayName)
            .Where(c => c.DisplayName != null && c.RegistryKey != null)
            .ToDictionary(k => k.RegistryKey.ToString(), v => v.DisplayName.ToString());

<强>更新

这是工作代码

    public static Dictionary<string, string> ListPrograms()
    {
        Dictionary<string, string> Apps = new Dictionary<string, string>();
        string registryKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
        using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey))
        {
            if (key != null)
            {
                var key1 = key.GetSubKeyNames();
                foreach (var z in key1.Select(s => key.OpenSubKey(s))
                    .Where(b => b != null && b.GetValue("DisplayName") != null && b.GetValue("UninstallString") != null).Select(b => new
                    {
                        DisplayName = b.GetValue("DisplayName").ToString(),
                        RegistryKey = b.GetValue("UninstallString").ToString()
                    }).Where(z => !Apps.ContainsKey(z.RegistryKey)))
                {
                    Apps.Add(z.RegistryKey, z.DisplayName);
                }
            }
        }
        return Apps;
    }

答案 1 :(得分:2)

您永远不会影响您为返回的变量创建的词典。