【发布时间】:2011-10-07 06:45:51
【问题描述】:
这个问题好像很多人都遇到过:
所以我看到了答案并尝试实现对 Equals 和 GetHashCode 的覆盖,但似乎我的编码有问题。
情况是这样的:我有一个用户(类)列表,每个用户都有一个列表和一个名称属性,列表属性包含许可证。我正在尝试做一个
if (!users.Contains(currentUser))
但它没有按预期工作。这是我为覆盖 Equals 和 GetHashCode 所做的代码:
public override bool Equals(object obj)
{
return Equals(obj as User);
}
public bool Equals(User otherUser)
{
if (ReferenceEquals(otherUser, null))
return false;
if (ReferenceEquals(this, otherUser))
return true;
return this._userName.Equals(otherUser.UserName) &&
this._licenses.SequenceEqual<string>(otherUser.Licenses);
}
public override int GetHashCode()
{
int hash = 13;
if (!_licenses.Any() && !_userName.Equals(""))
{
unchecked
{
foreach (string str in Licenses)
{
hash *= 7;
if (str != null) hash = hash + str.GetHashCode();
}
hash = (hash * 7) + _userName.GetHashCode();
}
}
return hash;
}
提前感谢您的建议和帮助!
编辑 1:
这是我正在执行 List.Contains 的代码,我试图查看列表是否已经包含某个用户,如果没有,则添加不存在的用户。 Contains 仅在第一次工作,当 currentUser 更改时,列表中的 User 更改为当前用户,这可能是与 equals 无关的问题,有什么想法吗?
if (isIn)
{
if (!listOfLicenses.Contains(items[3]))
listOfLicenses.Add(items[3]);
if (!users.Contains(currentUser))
{
User user2Add = new User();
user2Add.UserName = currentUser.UserName;
users.Add(user2Add);
userIndexer++;
}
if (users[userIndexer - 1].UserName.Equals(currentUser.UserName))
{
users[userIndexer - 1].Licenses.Add(items[3]);
}
result.Rows.Add();
}
【问题讨论】:
-
许可证列表有变化吗?
_userName有变化吗? -
您是否在调试器中单步执行以查看哪一行产生了不正确的结果?
-
我会删除
if (!_licenses.Any() && !_userName.Equals("")),因为它非常没用,但除此之外,它似乎还可以。您确定您的Licenses顺序相同吗? -
什么意思?我浏览了一个日志文件,并且在 StreamReading 文件时 currentUser 不断变化。由于某种原因,包含只工作一次(第一次),然后当 currentUser 更改用户列表的内部时也会更改。我想这不是很清楚,所以我将在编辑中发布相应的代码。
-
@L.B 我不明白你的意思你能进一步解释一下吗? :-)
标签: c# list hash overriding equals