[英]How do I group by List<int> in a Dictionary<string, List<int>> where the lists are identical?
我想使用Dictionary<string, List<int>>
,然后为字典中所有重复的List创建组。
Dictionary<string, List<int>> AllLists = new Dictionary<string, List<int>>()
{
{"one", new List<int>() {1, 2, 3, 4, 5}},
{"two", new List<int>() {1, 2, 3, 4, 5}},
{"three", new List<int>() {1, 1, 1, 1, 1}}
};
var ListGroups = AllLists.GroupBy(p => p.Value);
这应该将具有匹配列表的字典索引分为自己的组,但是它只是为字典中的每个索引创建一个组。 我究竟做错了什么?
这将对List<int>
对象使用引用比较。 由于包含[1, 2, 3, 4, 5]
两个List<int>
都是分别实例化的,因此它们将具有不同的引用。
请尝试以下操作,例如:
var ListGroups = AllLists.GroupBy(p => string.Join(",", p.Value));
这将按列表的string
表示形式进行分组。 请注意,这可能不是您想要执行的操作,纯粹是示范性的。
您可以使用GroupBy
方法的重载来传递自定义IEqualityComparer<List<int>>
,该自定义IEqualityComparer<List<int>>
实际上使用Enumerable.SequenceEqual
查看列表的内容。
这是IEqualityComparer<IEnumerable<T>>
:
class IEnumerableEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public bool Equals(IEnumerable<T> a, IEnumerable<T> b)
{
return Enumerable.SequenceEqual(a, b);
}
public int GetHashCode(IEnumerable<T> source)
{
if (source == null)
{
return 0;
}
int shift = 0;
int result = 1;
foreach (var item in source)
{
int hash = item != null ? item.GetHashCode() : 17;
result ^= (hash << shift)
| (hash >> (32 - shift))
& (1 << shift - 1);
shift = (shift + 1) % 32;
}
return result;
}
}
使用方法如下:
var ListGroups = AllLists.GroupBy(p => p.Value,
new IEnumerableEqualityComparer<int>());
请注意,由于IEqualityComparer<T>
在T
是互变的,因此可以将以上代码用于List<int>
因为它实现了IEnumerable<int>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.