如何通过减少一个或多个密钥并将多个记录(如果有)合并为一个密钥来合并具有多个(三个)密钥的字典?

时间:2013-10-21 11:19:21

标签: c# linq collections dictionary key

我有一个包含以下定义的词典。

    Dictionary<int[], int> D = new Dictionary<int[], int>();

其中键是3元素数组。我将此作为示例来简化我的场景。 (在我自己的代码中,Key是一个复杂的类对象,其中包含一个包含3-7个元素的List for key。)

    int[] key;
    key = new int[] { 1, 1, 1 };
    D.Add(key, 1);
    key = new int[] { 1, 1, 2 };
    D.Add(key, 2);
    key = new int[] { 1, 1, 3 };
    D.Add(key, 3);
    key = new int[] { 1, 2, 4 };
    D.Add(key, 4);
    key = new int[] { 2, 1, 1 };
    D.Add(key, 5);
    key = new int[] { 2, 5, 1 };
    D.Add(key, 6);

我想要的是有一种减少键数的方法,即。而不是具有三个元素的数组我想要一个2元素数组作为键,并将所有冗余值合并为一个单独的值,以便生成的KeyValue对应该看起来如下。 (减少键的第一个索引)

    {1 1, 6} //two instances of matching key of {1 1} resulted the value to have 1+5 =6
    {1 2, 2}
    {1 3, 3}
    {2 4, 4}
    {5 1, 6}

1 个答案:

答案 0 :(得分:1)

首先,您的字典可能无法按预期工作 - int[]类型没有默认比较器,因此键在字典中不是唯一的(您可以使用{{{{{ 1}}密钥例如)。要实现此目的,您需要提供自定义1 1 1。为了解决您的主要问题,还需要这样做:

IEqualityComparer<int[]>

所以你应该按如下方式创建你的字典:

public class IntArrayEqualityComparer : IEqualityComparer<int[]>
{
    public bool Equals(int[] x, int[] y)
    {
        if (x.Length != y.Length)
        {        
            return false;
        }

        return x.Zip(y, (v1, v2) => v1 == v2).All(b => b);
    }

    public int GetHashCode(int[] x)
    {
        return 0;
    }
}

回到主要问题,以下是如何实现预期结果:

Dictionary<int[], int> D
    = new Dictionary<int[], int>(new IntArrayEqualityComparer());