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

[TestFixture] class HashSetExample { [Test] public void eg() { var comparer = new OddEvenBag(); var hs = new HashSet(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 { 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下面的一行。

到底是什么? 我正在尝试实现一个与Point3D大小相似的laaaaaaarge数量的不可变引用对象。 似乎使用HashSet而不是Dictionary在内存中节省了大约10%。 不,显然这不是游戏改变者,但我认为尝试快速获胜并不会有什么坏处。 如果这冒犯了任何人,请道歉。

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

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

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

如果你必须使用Set来进行一次优化,你可以进行一次优化,首先进行contains检查,然后只有在包含返回true的情况下迭代Set 。 你几乎肯定会发现HashMap的额外开销很小(因为它本质上只是另一个对象引用)。