我有一本字典,定义如下。
Dictionary<int[], int> D = new Dictionary<int[], int>();其中键是一个3元素数组。我举这个例子来简化我的场景。(在我自己的代码中,键是一个复杂的类对象,其中包含一个键的3-7个元素的列表。)
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}发布于 2013-10-21 11:44:40
首先,您的字典可能不像您预期的那样工作--没有默认的int[]类型比较器,因此您的字典中的键不会是唯一的(例如,您可以有两个带有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());回到主要问题,下面是如何实现所期望的结果:
var result = D
.GroupBy(
kvp => kvp.Key.Skip(1).ToArray(),
new IntArrayEqualityComparer())
.ToDictionary(
g => g.Key,
g => g.Sum(x => x.Value));https://stackoverflow.com/questions/19493122
复制相似问题