【发布时间】:2014-01-03 22:44:26
【问题描述】:
假设我有课:
public class Ident
{
public String Name { get; set; }
public String SName { get; set; }
}
还有一个:
class IdenNode
{
public Ident id { get; set; }
public List<IdenNode> Nodes { get; set; }
public IdenNode()
{
Nodes = new List<IdenNode>();
}
}
我想使用 HashSet<IdenNode> 时要记住,当且仅当它们的 id.Names 相等时,它的两个元素是相同的(相等)。
所以,我将覆盖 Equals 和 GetHashCode,如下所示:
public override bool Equals(object obj)
{
IdenNode otherNode = obj as IdenNode;
return otherNode != null &&
otherNode.id != null &&
id.Name == otherNode.id.Name;
}
public override int GetHashCode()
{
if (id != null)
return id.Name.GetHashCode();
else
// what should I write here?
}
我觉得对吗?如果是,我应该在GetHashCode 中放置什么?
更新
能否告诉我可以在Equals 方法中使用== 和!= 吗?或者可能是ReferenceEquals 或其他?
另外,我应该覆盖运算符== 和!= 吗?
【问题讨论】:
-
字符串用作标识符、区分大小写等是一件很糟糕的事情。您不能使用 int 或 GUID 之类的东西(是的,它是一个字符串,但它保证对您的系统来说是唯一的)
-
@Maess 提出了一个很好的观点。如果两个人同名同姓怎么办?
-
@Maess 一个 GUID 不是字符串! :)
-
@Moo-Juice 你是对的,我在考虑数据库,有时它是一个字符串。
-
你不应该覆盖任何东西。使用相等比较器创建 HashSet(保持问题本地化)。如果你坚持,至少用
private set;替换那些set;