如何从字典中获取不匹配的列表

时间:2019-01-23 11:51:39

标签: c# linq

我想使用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的字典。

2 个答案:

答案 0 :(得分:1)

基于以下假设:仅应忽略其中一个词典中的项目:

lowerActionRoles.Where(entry =>
{
    if (upperActionRoles.TryGet(entry.Key, out List<int> upperActionList))
    {
        return !upperActionList.SequenceEqual(entry.Value);
    }
    else
    {
        return false;
    }
}

这将返回lowerActionRolesIEnumerable<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();

输出:

enter image description here

注意:如果您想从其他词典中获取列表,只需在上述查询中切换词典名称即可。