首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过减少一个或多个键并将多个记录(如果有的话)合并为一个单独的键来合并具有多个(三个)键的字典?

如何通过减少一个或多个键并将多个记录(如果有的话)合并为一个单独的键来合并具有多个(三个)键的字典?
EN

Stack Overflow用户
提问于 2013-10-21 11:19:20
回答 1查看 216关注 0票数 0

我有一本字典,定义如下。

代码语言:javascript
复制
    Dictionary<int[], int> D = new Dictionary<int[], int>();

其中键是一个3元素数组。我举这个例子来简化我的场景。(在我自己的代码中,键是一个复杂的类对象,其中包含一个键的3-7个元素的列表。)

代码语言:javascript
复制
    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对看起来应该是这样的。(减少键的第一个索引)

代码语言:javascript
复制
    {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}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-21 11:44:40

首先,您的字典可能不像您预期的那样工作--没有默认的int[]类型比较器,因此您的字典中的键不会是唯一的(例如,您可以有两个带有1 1 1键的元素)。要使它正常工作,您需要提供自定义IEqualityComparer<int[]>。要使主要问题的解决方案发挥作用,还需要这样做:

代码语言:javascript
复制
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;
    }
}

因此,您应该按以下方式创建您的字典:

代码语言:javascript
复制
Dictionary<int[], int> D
    = new Dictionary<int[], int>(new IntArrayEqualityComparer());

回到主要问题,下面是如何实现所期望的结果:

代码语言:javascript
复制
var result = D
    .GroupBy(
        kvp => kvp.Key.Skip(1).ToArray(),
        new IntArrayEqualityComparer())
    .ToDictionary(
        g => g.Key,
        g => g.Sum(x => x.Value));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19493122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档