LINQ toDictionary is Empty
本文关键字:Empty is toDictionary LINQ | 更新日期: 2023-09-27 18:16:56
有人能向我解释一下我做错了什么,为什么这不起作用?我只是想从注册表项中获取值,并将它们返回给主函数作为字典。
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);
然而,我的列表框总是空的。有没有更有效的方法?
你的代码
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;
}
您永远不会影响您创建的字典到您返回的变量。