代码之家  ›  专栏  ›  技术社区  ›  gatoatigrado

如何将C列表转换为可哈希的内容?

  •  2
  • gatoatigrado  · 技术社区  · 14 年前

    我想要一些与python的tuples(或者,对于sets,frozensets)一致的东西,它们是可以散列的。我有一个 List<String> 这无疑是不正确的散列(即按值)。

    1 回复  |  直到 14 年前
        1
  •  3
  •   user166390    14 年前

    您必须定义自己的容器,可能会包装列表,以获得相等哈希等于(gethashcode和equals)的有用语义。如果你愿意的话,你甚至可以使包装符合IList。

    为了避免可变问题和更改gethashcode/equals结果(这会使哈希字典中新对象的使用有问题!)您还应该提供某种保护(可能在创建类型时复制输入)和/或记录约束。

    你可以使用 SequenceEqual 要实现equals相当琐碎,但您需要以相关的方式实现gethashcode——一个简单的方法是每个元素的gethashcode的移位xor。

    或者,如果这只是在单个字典中使用,则可以提供自定义 IEqualityComparer 避免创建包装类型: Dictionary constructor overload .

    这取决于你的最终目标是什么,而且很可能已经有了这样的包装容器:—)

    注:在.net4中有一组 Tuple<...> classes 它重写gethashcode和equals。见 cadenza 作为早期.NET版本的第三方备选方案。