C#参考集<;T>;
我需要一个“引用集”,也就是说,一个几乎是散列集的集合,但它使用对象的引用,而不是它们的散列码。在哪里可以找到这样的类,或者如何实现这样的类?为了澄清,我不在乎它是否在内部像使用引用的哈希集一样工作,我只希望它在外部像它一样工作。我不希望使用外部库,但欢迎链接到具有此类库的库的源代码(这样我就可以自己使用它来了解如何实现一个库)。标准C#参考集<;T>;,c#,.net,C#,.net,我需要一个“引用集”,也就是说,一个几乎是散列集的集合,但它使用对象的引用,而不是它们的散列码。在哪里可以找到这样的类,或者如何实现这样的类?为了澄清,我不在乎它是否在内部像使用引用的哈希集一样工作,我只希望它在外部像它一样工作。我不希望使用外部库,但欢迎链接到具有此类库的库的源代码(这样我就可以自己使用它来了解如何实现一个库)。标准哈希集允许您提供自定义比较器,比较器负责对集合元素进行散列和相等性检查。给它一个身份比较器,你就会得到你描述的功能 public sealed class Iden
哈希集允许您提供自定义比较器,比较器负责对集合元素进行散列和相等性检查。给它一个身份比较器,你就会得到你描述的功能
public sealed class IdentityComparer<T> : IEqualityComparer<T>
where T : class
{
public bool Equals(T x, T y)
{
return ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
}
}
public sealed class identity comparer:IEqualityComparer
T:在哪里上课
{
公共布尔等于(TX,TY)
{
返回引用等于(x,y);
}
公共int GetHashCode(T obj)
{
返回System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
}
}
标准的HashSet
允许您提供一个自定义比较器,该比较器负责对集合元素进行散列并执行相等性检查。给它一个身份比较器,你就会得到你描述的功能
public sealed class IdentityComparer<T> : IEqualityComparer<T>
where T : class
{
public bool Equals(T x, T y)
{
return ReferenceEquals(x, y);
}
public int GetHashCode(T obj)
{
return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
}
}
public sealed class identity comparer:IEqualityComparer
T:在哪里上课
{
公共布尔等于(TX,TY)
{
返回引用等于(x,y);
}
公共int GetHashCode(T obj)
{
返回System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
}
}
这感觉像是XY问题-。你为什么要这样做?你能告诉我们为什么不能使用HashSet
使用ReferenceEqualityComparer
@mjwills我不知道Hashset可以接受IEqualityComparers。感谢您的快速解决方案。这感觉像是一个XY问题-。你为什么要这样做?你能告诉我们为什么不能使用HashSet
使用ReferenceEqualityComparer
@mjwills我不知道Hashset可以接受IEqualityComparers。感谢您的快速解决方案。“RuntimeHelpers.GetHashCode方法总是调用Object.GetHashCode”,那么它与标准HashSet有何不同呢?@HenkHolterman这正是它的不同之处。例如,给定一个字符串,它将调用对象.GetHashCode
方法,这意味着非虚拟的,而不是对GetHashCode
的虚拟调用将导致的字符串.GetHashCode
实现。这正是我需要的,谢谢@hvd-好的,公平点。不过还是个问题。在什么情况下会更好?例如,对于HashSet
“RuntimeHelpers.GetHashCode方法总是调用Object.GetHashCode”,那么它与标准HashSet有何不同呢?@HenkHolterman这正是它的不同之处。例如,给定一个字符串,它将调用对象.GetHashCode
方法,这意味着非虚拟的,而不是对GetHashCode
的虚拟调用将导致的字符串.GetHashCode
实现。这正是我需要的,谢谢@hvd-好的,公平点。不过还是个问题。在什么情况下会更好?例如,对于HashSet
?