Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Linq从两个字典列表中获取唯一值?_C#_Asp.net_Linq_List_Dictionary - Fatal编程技术网

C# 如何使用Linq从两个字典列表中获取唯一值?

C# 如何使用Linq从两个字典列表中获取唯一值?,c#,asp.net,linq,list,dictionary,C#,Asp.net,Linq,List,Dictionary,这是我的密码 public class Model { public Model(); public Dictionary<string, string> Data { get; set; } } list<dictionary<string,string>> data1; list<dictionary<string,string>> data2; data1=await get<model>(

这是我的密码

public class Model
{
    public Model();

    public Dictionary<string, string> Data { get; set; }

}

list<dictionary<string,string>>  data1;
list<dictionary<string,string>>  data2;

data1=await get<model>();
data2=await get<model>();

data1[0]=[0][{id,101}]
         [1][{name,one}]
         [2][{marks,56}]
         [3][{state,ap}]     

data1[1]=[0][{id,102}]
         [1][{name,two}]
         [2][{marks,65}]
         [3][{state,up}]     

data1[2]=[0][{id,103}]
         [1][{name,three}]
         [2][{marks,89}]
         [3][{state,usa}]     



data2[0]=[0][{roleid,101}]
         [1][{stdname,one}]
data2[1]=[0][{roleid,102}]
         [1][{stdname,two}]

在上面的代码中,我有两个字典列表,我想通过比较两个列表获得unqiue id值。除了基于第一个列表id和第二个列表roleid的两个列表中的值之外,上述两个列表的键名不同。

假设您希望与列表相交:

使用“相交”方法。首先在两个字典之间实现一个比较器:

public class DictComparer : IEqualityComparer<Dictionary<string, string>>
{
    public bool Equals(Dictionary<string, string> x, Dictionary<string, string> y)
    {
        return (x == y) || (x.Count == y.Count && !x.Except(y).Any());
    }

    public int GetHashCode(Dictionary<string, string> x)
    {
        var ret = 123;
        foreach (var keyValue in x)
        {
            ret = ret + (keyValue.GetHashCode() * 31);
        }
        return ret;
    }
}
编辑:注意到他想要的正好相反。相应地更改了功能。
Edit2:我缺少字典的GetHashCode的正确实现。此实现似乎有效:

如果要使用字典的Id来比较字典,则必须实现自定义比较器

public class DictComparerById : IEqualityComparer<Dictionary<string, string>>
{
    public bool Equals(Dictionary<string, string> x, Dictionary<string, string> y)
    {
        // Two dictionary are equal if the have the same "id"
        string idX;
        if(!x.TryGetValue("id", out idX))
            x.TryGetValue("roleid", out idX);

        string idY;
        if(!y.TryGetValue("id", out idY))
            y.TryGetValue("roleid", out idY);

        return (idX == idY);
    }

    public int GetHashCode(Dictionary<string, string> x)
    {
        string id;
        if(!x.TryGetValue("id", out id))
            x.TryGetValue("roleid", out id);
        return id.GetHashCode();
    }
}

我不清楚您是在寻找仅存在于两个列表中的一个词典中的词典条目,还是仅存在于一个列表的词典中的条目,而不存在于另一个列表中的条目。同样的价值也会起作用吗?如果是这样的话,您可能会得到具有不同值的重复键。我在linqpad代码段中实现了您的版本,但它不起作用。运行代码了吗?错误在我的GetHashCode中。我使用我在这里找到的一个实现编辑了我的解决方案:您的代码将在两个字典中的相同键名上运行,但我有不同的键名。谢谢@deramko,但我在两个字典中有不同的键名dictionaries@durgasivakishoremopuru我已经更新了我的代码和小提琴,以处理多个id密钥名称。现在应该可以了。
var result = data1.Union(data2).Except(data1.Intersect(data2, new DictComparer()), new DictComparer());
public class DictComparerById : IEqualityComparer<Dictionary<string, string>>
{
    public bool Equals(Dictionary<string, string> x, Dictionary<string, string> y)
    {
        // Two dictionary are equal if the have the same "id"
        string idX;
        if(!x.TryGetValue("id", out idX))
            x.TryGetValue("roleid", out idX);

        string idY;
        if(!y.TryGetValue("id", out idY))
            y.TryGetValue("roleid", out idY);

        return (idX == idY);
    }

    public int GetHashCode(Dictionary<string, string> x)
    {
        string id;
        if(!x.TryGetValue("id", out id))
            x.TryGetValue("roleid", out id);
        return id.GetHashCode();
    }
}
var dictCmp = new DictComparerById();
var data3 = data1
    .Union(data2, dictCmp)
    .Except(data1.Intersect(data2, dictCmp), dictCmp);