基于非哈希的集合集合,用于使用自定义相等比较器存储唯一对象-C# - c#

我正在尝试将(名称:字符串,值:long)对存储在一组中。

public class NameValuePair
{
  public string name;
  public long value;
}

public NameValuePairComparer comparer = new NameValuePairComparer();
public HashSet<NameValuePair> nameValueSet = new HashSet<NameValuePair>(comparer);

两对具有相等名称或相等值的对象是相等的-这是通过EqualComparer的NameValuePairComparer重写Equals方法实现的:

public class NameValuePairComparer : EqualityComparer<NameValuePair>
{
   public override bool Equals(NameValuePair x, NameValuePair y)
   {
      return (x.value == y.value) || (x.name == y.name);
   }

问题是:对于两个等于Equals返回true的对象,GetHashCode(NameValuePair obj)应该返回相同的值,因此对于给定的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会是更好的方法吗?

参考方案

如果两对名字或值相等,则它们相等

从根本上说,您无法使用这些条件正确实施IEqualityComparer<T>。从Equals的文档中:

等于方法是自反,对称和可传递的。也就是说,如果用于将对象与其自身进行比较,则返回true;否则,返回true。如果两个对象x和y为y,则为true;否则为true。如果两个对象x和z分别为true和y和z,则为true。

现在考虑对:

x = { "A", 10 },
y = { "A", 20 },
z = { "B", 20 }

您是说xy必须相等,因为它们具有相同的名称,而yz必须相等,因为它们具有相同的值。这意味着(通过传递性)xz应该相等。

由于您无法正确实现IEqualityComparer<T>,因此不应期望任何依赖于此正确性的方法来工作。

我怀疑您会发现,如果您更详细地查看自己的需求,它们要么真正需要两个集合(一个按名称,一个按值),要么就传递性而言没有意义。

例如,假设您有一个具有建议特征的集合,并在上面添加了三个元素。如果按{x,y,z}的顺序添加它们,则最终将只有一个条目。如果按{z,x,y}的顺序添加它们,则最终将得到两个。那是一种有用的组合吗?

Google Collections-来自collections.filter的可修改迭代器? - java

从Collections2.filter返回的集合是不可修改的,其迭代器也是如此。是否有类似的东西可以返回我经过过滤的集合实时视图,但是具有可修改的迭代器?我需要在迭代器上使用remove()方法。谢谢。 参考方案 new ArrayList(Collections2.filter(...))怎么样?如果出于某种原因坚持使用过滤器。顺便说一句,Collect…

C#排序与Java Collections.Sort给出不同的结果 - java

            C#代码:public class Test { public static void Main() { List<string> list = new List<string> { "[email protected]", "[email protected]"…

LeetCode题解96.unique-binary-search-trees

题目地址(96. 不同的二叉搜索树) https://leetcode-cn.com/problems/unique-binary-search-trees-ii/description/ 题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二…

Collections.sort()在大型ArrayList中失败,经常排序 - java

我已经看到了很多与此问题相关的帖子,但是我进行的每张办公桌检查和实施的建议都无济于事。我不知道我是如何违反比较者的合同的。当然,我不经常使用比较器。我有一个很大的ArrayList对象,它们在每次更新时都会排序,因为它们的位置经常变化。我必须按照从左下到右上的顺序渲染这些对象,以保持“深度”,就像2D程序一样。这是我的比较器:@Override public…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制