我想使用LINQ根据列表项获得不匹配的字典。请参考我的示例代码
Dictionary<string, List<int>> lowerActionRoles = new Dictionary<string, List<int>>();
Dictionary<string, List<int>> upperActionRoles = new Dictionary<string, List<int>>();
lowerActionRoles.Add("11", new List<int>() { 1, 2, 4 });
upperActionRoles.Add("11", new List<int>() { 1, 2, 4, 5 });
lowerActionRoles.Add("13", new List<int>() { 1, 2, 4 });
lowerActionRoles.Add("21", new List<int>() { 1, 2, 4 });
upperActionRoles.Add("21", new List<int>() { 1, 2, 4 });
在这里,我有2个字典LowerActionRoles和upperActionRoles。键21匹配而键11不匹配的字典。在这里,我要获取带有键11的字典。
答案 0 :(得分:1)
基于以下假设:仅应忽略其中一个词典中的项目:
lowerActionRoles.Where(entry =>
{
if (upperActionRoles.TryGet(entry.Key, out List<int> upperActionList))
{
return !upperActionList.SequenceEqual(entry.Value);
}
else
{
return false;
}
}
这将返回lowerActionRoles
(IEnumerable<KeyValuePair<string, List<int>>>
)中的条目集合。
如果您只对按键感兴趣,请添加
.Select(entry => entry.Key);
上一个查询
并转换为新词典:
.ToDictionary(entry => entry.Key, entry => entry.Value);
答案 1 :(得分:0)
您可以使用ContainsKey
测试两个字典中是否都存在键,然后使用SequenceEqual
来检查该列表的值,例如
var result = upperActionRoles
.Where(entry => lowerActionRoles.ContainsKey(entry.Key) && !lowerActionRoles[entry.Key].SequenceEqual(entry.Value))
.ToDictionary(entry => entry.Key, entry => entry.Value);
并在控制台窗口上显示结果,
foreach (var item in result)
{
Console.WriteLine("Key: " + item.Key);
Console.WriteLine();
item.Value.ForEach(x => Console.WriteLine("Value: " + x));
}
Console.ReadLine();
输出:
注意:如果您想从其他词典中获取列表,只需在上述查询中切换词典名称即可。