有人可以向我解释我做错了什么以及为什么这不起作用?我只是试图从注册表项中获取值,并将它们作为字典返回到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);
但是,我的列表框始终为空。有没有更有效的方法来做到这一点?
答案 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)
您永远不会影响您为返回的变量创建的词典。