我正在尝试将 (name: string, value: long) 对存储在一个集合中。
public class NameValuePair
{
public string name;
public long value;
}
public NameValuePairComparer comparer = new NameValuePairComparer();
public HashSet<NameValuePair> nameValueSet = new HashSet<NameValuePair>(comparer);
如果两个对具有相同的名称或相同的值,则它们是相等的 - 这在 NameValuePairComparer 中实现,覆盖 EqualityComparer 的 Equals 方法:
public class NameValuePairComparer : EqualityComparer<NameValuePair>
{
public override bool Equals(NameValuePair x, NameValuePair y)
{
return (x.value == y.value) || (x.name == y.name);
}
问题是:GetHashCode(NameValuePair obj) 应该为 Equals 返回 true 的两个对象返回相同的值,因此对于给定的 NameValuePair,GetHashCode() 应该返回 value.GetHashCode() 或 name.GetHashCode(),但要这样做我们必须知道两对中的哪个字段相等:
public override int GetHashCode(NameValuePair obj)
{
/* ??? */
/* // Using unknown reference to x
if (obj.value == x.value) return obj.value.GetHashCode();
else if (obj.name == x.name) return obj.name.GetHashCode();
else return base.GetHashCode(obj);
*/
}
}
但是我们不知道这一点,这意味着我不能使用 HashSet 来存储这些对,也不能使用 EqualityComparer。
问:C# (.net 3.5) 中是否有基于非散列的 set 实现?
问:使用自定义相等比较器存储唯一 NameValuePairs 的更好方法是什么?