我可以在给定对象 y 的情况下检索哈希集中存储的值 x,其中 x.Equals(y)

本文关键字:其中 Equals 存储 哈希 对象 情况下 我可以 检索 集中 | 更新日期: 2023-09-27 18:29:24

[TestFixture]
class HashSetExample
{
    [Test]
    public void eg()
    {
        var comparer = new OddEvenBag();
        var hs = new HashSet<int>(comparer);
        hs.Add(1);
        Assert.IsTrue(hs.Contains(3));
        Assert.IsFalse(hs.Contains(0));
        // THIS LINE HERE
        var containedValue = hs.First(x => comparer.Equals(x, 3)); // i want something faster than this
        Assert.AreEqual(1, containedValue);
    }
    public class OddEvenBag : IEqualityComparer<int>
    {
        public bool Equals(int x, int y)
        {
            return x % 2 == y % 2;
        }
        public int GetHashCode(int obj)
        {
            return obj % 2;
        }
    }
}

除了检查hs是否包含奇数外,我还想知道如果包含什么奇数。显然,我想要一种合理扩展的方法,而不是简单地迭代和搜索整个集合。

改写这个问题的另一种方法是,我想用有效的东西替换这里这一行下面的行(比如 O(1(,而不是 O(n((。

为了什么目的?我正在尝试实习大量与 Point3D 大小相似的不可变引用对象。似乎使用 HashSet<Foo> 而不是 Dictionary<Foo,Foo> 可以节省大约 10% 的内存。不,显然这不是一个改变游戏规则的人,但我认为尝试它以获得快速的胜利不会有什么坏处。如果这冒犯了任何人,我们深表歉意。

编辑:链接到Balazs Tihanyi在评论中提供的类似/相同的帖子,放在这里强调。

我可以在给定对象 y 的情况下检索哈希集中存储的值 x,其中 x.Equals(y)

简单的答案是否定的,你不能。

如果要检索对象,则需要使用HashSet。API 中没有任何合适的方法来执行您要求的事情。

但是,如果您必须为此使用Set,您可以进行的一种优化是首先执行contains检查,然后仅在包含返回 true 时才迭代Set。尽管如此,您几乎肯定会发现HashMap的额外开销很小(因为本质上它只是另一个对象引用(。

相关文章: