我创建了以下代码来验证一系列"元组"的唯一性:
struct MyTuple
{
public MyTuple(string a, string b, string c)
{
ValA = a; ValB = b; ValC = c;
}
private string ValA;
private string ValB;
private string ValC;
}
...
HashSet<MyTuple> tupleList = new HashSet<MyTuple>();
Run Code Online (Sandbox Code Playgroud)
如果我是正确的,我将不会得到两个具有相同值的元组,HashSet这要归功于我正在使用一个结构.如果没有实现类IEquatable或类似的东西我就不能有相同的行为(我没有太多挖掘如何做到这一点).
我想知道是否有一些关于我做什么的问题.性能方面,考虑到里面的字符串是引用类型,我不希望结构的使用成为问题.
编辑:我希望我的HashSet永远不会包含两个具有相同值的字符串的元组.换句话说,我希望字符串的行为类似于值类型.
问题是它不会起作用.如果两个字符串是"a",它们仍然可以是不同的引用.那种情况会破坏你的实施.
实现Equals()并GetHashCode()正确实现(例如使用提供的字符串中的那些,并在结构中使用NULL引用),并可能IEquatable<MyTuple>使其更好.
编辑:默认实现显然不适合在哈希表和集中使用.这在ValueType.GetHashCode()实施中明确说明(增加的重点):
GetHashCode方法适用于从ValueType派生的类型.派生类型的一个或多个字段用于计算返回值.如果调用派生类型的GetHashCode方法,则返回值 可能不适合用作哈希表中的键.此外,如果这些字段中的一个或多个字段的值发生更改,则返回值可能不适合用作哈希表中的键.在任何一种情况下,请考虑编写自己的GetHashCode方法实现,该方法更接近地表示该类型的哈希代码的概念.
你应该总是实现Equals()和GetHashCode()"配对",这更加明显,因为ValueType.Equals()它非常低效且不可靠(使用反射,未知的相等比较方法).此外,在不覆盖这两个时会出现性能问题(在调用默认实现时,结构将被装箱).
| 归档时间: |
|
| 查看次数: |
5214 次 |
| 最近记录: |