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# 给定一个对象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

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

另一种重新表述问题的方式是,我想用一些有效的东西(比如O(1),而不是O(n))来替换这一行下面的那一行

朝着什么方向?我正在尝试实习大量大小与Point3D相似的不可变参考对象。似乎使用
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;
        }
    }
}