这就是我所拥有的:
class A
{
// The uniqueness of instance must be detected by this property
public string Key { get; set; }
// There are other properties
}
var set = HashSet<A>()
Run Code Online (Sandbox Code Playgroud)
我的一般目的是:
set按Key属性值提供集合中实例的标识
使收集工作尽可能快地进行包含操作
回答以下问题可能有助于我实现这一目的:
Contains,Add哪些必须确定实例的唯一性:GetHashCode()或IEquatable?最有可能的GetHashCode()作为HashSet声明为搜索速度非常快.String.GetHashCode()实现不保证2个不同字符串的哈希的唯一性,那么我如何才能提供性能的唯一性?请注意,他的集合仅在运行时创建和销毁,不会保存到数据库中
Dan*_*ner 11
集合通常使用Object.GetHashCode()和Object.Equals()获取哈希码并检查相等性.除了Object.GetHashCode()最简单的对象之外,没有办法为所有对象返回唯一的哈希码 - 哈希码只有32位宽,每个内部状态超过32位的对象都不能映射到唯一的哈希码.因此Object.Equals(),用于在哈希码冲突的情况下检查确切的相等性.
因此,您必须使用合适的实现覆盖两个提到的方法.
public override Int32 GetHashCode()
{
// If this.Key may be null you have to handle this case.
return this.Key.HashCode();
}
public override Boolean Equals(Object obj)
{
var other = obj as A;
return (other != null) && (this.Key == other.Key);
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用HashSet<T>构造函数接受IEqualityComparer<T>和外部化两种方法,例如,如果您无法控制要添加到集合的类型的源代码.只需使用合适的方法创建一个实现接口的类,并将此类的实例传递给HashSet<T>构造函数.