mac*_*ack 0 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;
}
Run Code Online (Sandbox Code Playgroud)
检索字典后,我将其绑定到列表框.
listBox1.DisplayMember = "Value";
listBox1.ValueMember = "Key";
listBox1.DataSource = new BindingSource(u.ListPrograms(), null);
Run Code Online (Sandbox Code Playgroud)
但是,我的列表框始终为空.有没有更有效的方法来做到这一点?
你的代码
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());
Run Code Online (Sandbox Code Playgroud)
更新
这是工作代码
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1277 次 |
| 最近记录: |