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

标签 c# collections

[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))替换 THIS LINE HERE 下面的行。

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

编辑:Link to similar/identical post由 Balazs Tihanyi 在评论中提供,此处用于强调。

最佳答案

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

如果您想检索对象,您需要使用 HashSet。 API 中没有任何合适的方法来执行您要求的其他操作。

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

关于c# - 我可以在给定对象 y 的哈希集中检索存储值 x,其中 x.Equals(y),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9917662/

相关文章:

c# - 采用无效代码路径时抛出哪个异常?

javascript - 在 Underscore.js 中使用 JavaScript-Iterables

java - 有没有更快的方法从对象集合中提取唯一值?

java - 在java中迭代和修改集合时创建临时缓冲区的优点

javascript - findOne 返回对象而不是文档

c# - 将对象集合解压缩到其属性数组中

c# - 为什么在 linq 中迭代一个组与迭代一个集合不同

c# - 在 C# 中解析命令行选项

c# - 计时器在 Web 服务中 20 分钟后停止工作

c# - 在以下情况下,我应该使用线程安全集合吗?