C# 给定一个对象y,其中x.Equals(y),我可以检索哈希集中存储的值x吗 [TestFixture] 类HashSetExample { [测试] 公共空间 { var比较器=新的OddEvenBag(); var hs=新哈希集(比较器); hs.增加(1); Assert.IsTrue(hs.Contains(3)); Assert.IsFalse(hs.Contains(0)); //这条线在这里 var containedValue=hs.First(x=>comparer.Equals(x,3));//我想要比这更快的东西 Assert.AreEqual(1,containedValue); } 公共类:IEqualityComparer { 公共布尔等于(整数x,整数y) { 返回x%2==y%2; } 公共int GetHashCode(int obj) { 返回对象%2; } } }
除了检查hs是否包含奇数外,我还想知道它包含什么奇数。显然,我想要一个能够合理扩展的方法,而不是简单地迭代和搜索整个集合 另一种重新表述问题的方式是,我想用一些有效的东西(比如O(1),而不是O(n))来替换这一行下面的那一行 朝着什么方向?我正在尝试实习大量大小与Point3D相似的不可变参考对象。似乎使用C# 给定一个对象y,其中x.Equals(y),我可以检索哈希集中存储的值x吗 [TestFixture] 类HashSetExample { [测试] 公共空间 { var比较器=新的OddEvenBag(); var hs=新哈希集(比较器); hs.增加(1); Assert.IsTrue(hs.Contains(3)); Assert.IsFalse(hs.Contains(0)); //这条线在这里 var containedValue=hs.First(x=>comparer.Equals(x,3));//我想要比这更快的东西 Assert.AreEqual(1,containedValue); } 公共类:IEqualityComparer { 公共布尔等于(整数x,整数y) { 返回x%2==y%2; } 公共int GetHashCode(int obj) { 返回对象%2; } } },c#,collections,C#,Collections,除了检查hs是否包含奇数外,我还想知道它包含什么奇数。显然,我想要一个能够合理扩展的方法,而不是简单地迭代和搜索整个集合 另一种重新表述问题的方式是,我想用一些有效的东西(比如O(1),而不是O(n))来替换这一行下面的那一行 朝着什么方向?我正在尝试实习大量大小与Point3D相似的不可变参考对象。似乎使用HashSet而不是Dictionary可以节省大约10%的内存。不,显然这不是游戏规则的改变者,但我想尝试一下快速获胜不会有什么坏处。如果这冒犯了任何人,请道歉 编辑:由Balazs Ti
HashSet
而不是Dictionary
可以节省大约10%的内存。不,显然这不是游戏规则的改变者,但我想尝试一下快速获胜不会有什么坏处。如果这冒犯了任何人,请道歉
编辑:由Balazs Tihanyi在评论中提供,放在这里作为重点。简单的答案是不,你不能 如果要检索对象,则需要使用
哈希集
。API中没有任何合适的方法来实现您的要求
如果必须使用
集合
,则可以进行一个优化,即首先执行包含
检查,然后仅在包含返回true时在集合
上迭代。不过,您几乎肯定会发现HashMap
的额外开销很小(因为它本质上只是另一个对象引用)。从HashSet
中“检索”值的概念是毫无意义的,所以我很困惑。他的意思是获取存储在HashSet中的元素。在测试方法中,该值为1。@KirkWoll它将有助于内存优化,而不是使用键和值始终相同的字典。不幸的是,HashSet
的接口不支持这一点。这种模式的一个应用是获取具有自定义等式的类型的规范实例
[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;
}
}
}