如何将C#列表转换为可清除的内容?

时间:2010-06-17 06:12:09

标签: c# list hash

我想要的东西是Python的元组(或者,对于集合,frozensets),它们是可以清除的。我有一个List<String>,它肯定没有正确散列(即按值)。

1 个答案:

答案 0 :(得分:3)

您必须定义自己的容器,可能包装List,以获得有效的语义 - equality-hash-equals(GetHashCode和Equals)。如果你愿意,甚至可以让包装器符合IList。

为了避免可变性问题和更改GetHashCode / Equals结果(这会使哈希字典中的新对象出现问题!),您还应提供某种保护(也许在创建您的输入时复制输入)输入和/或记录约束。

你可以使用SequenceEqual来实现Equals,但是你需要以相关的方式实现GetHashCode - 一个简单的方法是改变每个元素的GetHashCode的XOR。

或者,如果仅在单个词典中使用它,则可以提供自定义IEqualityComparer并避免创建包装类型:Dictionary constructor overload

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

注意:在.NET4中有一组Tuple<...> classes覆盖GetHashCode和Equals。请参阅cadenza作为先前.NET版本的第三方替代方案。