C#HashSet Generic允许重复

在MSDN上读取HashSet,它用HashSet ,如果T实现IEquatable则HashSet将此用于IEqualityComparer.Default

所以,让class级人员:

 public class Person : IEquality { private string pName; public Person(string name){ pName=name; } public string Name { get { return pName; } set { if (pName.Equals(value, StringComparison.InvariantCultureIgnoreCase)) { return; } pName = value; } } public bool Equals(Person other) { if(other==null){return false;} return pName.Equals(other.pName, StringComparison.InvariantCultureIgnoreCase); } public override bool Equals(object obj) { Person other = obj as Person; if(other==null){return false;} return Equals(other); } public override int GetHashCode(){return pName.GetHashCode();} public override string ToString(){return pName;} } 

所以,让我们在另一个类或主函数中定义:

 HashSet set = new HashSet(); set.Add(new Person("Smith"); // return true Person p = new Person("Smi"); set.Add(p); // return true p.Name = "Smith"; // no error occurs 

现在,你在HashSet中有两个具有相同名称的Person对象(因此,有“Equals”)。

HashSet让我们放置重复的对象。

HashSet让我们放置重复的对象。

它不会让你放入重复的对象。 问题是你在添加对象后会改变它。

变异对象在字典中用作键或存储为哈希值总是有问题的,我建议避免使用它。