[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/