Gra*_*meF 24 .net c# collections
我希望HashSet<T>
用作词典的关键:
Dictionary<HashSet<T>, TValue> myDictionary = new Dictionary<HashSet<T>, TValue>();
Run Code Online (Sandbox Code Playgroud)
我想从字典中查找值,HashSet<T>
以便包含相同项的两个不同实例将返回相同的值.
HashSet<T>
的实现Equals()
和GetHashCode()
似乎并没有这样做(我认为它们只是默认值).我可以覆盖Equals()
使用SetEquals()
但是怎么样GetHashCode()
?我觉得我在这里错过了一些东西......
dig*_*All 38
您可以使用以下提供的set comparer HashSet<T>
:
var myDictionary = new Dictionary<HashSet<T>, TValue>(HashSet<T>.CreateSetComparer());
Run Code Online (Sandbox Code Playgroud)
digEmAll的答案显然是实践中更好的选择,因为它使用内置代码而不是重新发明轮子.但我将把它作为一个示例实现.
您可以使用实施IEqualityComparer<HashSet<T>>
使用SetEquals
.然后将它传递给Dictionary的构造函数.像下面的东西(没有测试):
class HashSetEqualityComparer<T>: IEqualityComparer<HashSet<T>>
{
public int GetHashCode(HashSet<T> hashSet)
{
if(hashSet == null)
return 0;
int h = 0x14345843; //some arbitrary number
foreach(T elem in hashSet)
{
h = unchecked(h + hashSet.Comparer.GetHashCode(elem));
}
return h;
}
public bool Equals(HashSet<T> set1, HashSet<T> set2)
{
if(set1 == set2)
return true;
if(set1 == null || set2 == null)
return false;
return set1.SetEquals(set2);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这里的哈希函数是可交换的,这很重要,因为集合中元素的枚举顺序是未定义的.
另一个有趣的一点是,您不能只使用,elem.GetHashCode
因为当向集合提供自定义相等比较器时,这会产生错误的结果.