我尝试减去 2 个列表,如下代码所示,assignUsers
已获得 3 条记录assignedUsers
有 2 行。后Except
方法我仍然得到 3 行,尽管我应该得到 1 条记录,因为 2 行assignedUsers
类似于assignUsers
var users = accountApp.GetUsersByAccountId(context.GetUserData().AccountId);
List<AssignUserViewModel> assignUsers = Mapper.Map<List<AssignUserViewModel>>(users).ToList();
var mailUsers = mailApp.GetMailAssignedByMailId(id).Select(m => new { m.UserId, m.User.Name }).ToList();
List<AssignUserViewModel> assignedUsers = mailUsers.Select(Mapper.DynamicMap<AssignUserViewModel>).ToList();
assignUsers = assignUsers.Except(assignedUsers).ToList();
为了要做Except
方法按预期工作,类AssignUserViewModel
一定有GetHashCode
and Equals
方法被正确覆盖。
例如,如果AssignUserViewModel
对象由它们的唯一定义Id
,你应该这样定义类:
class AssignUserViewModel
{
// other methods...
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
public override bool Equals(object obj)
{
if (!(obj is AssignUserViewModel))
throw new ArgumentException("obj is not an AssignUserViewModel");
var usr = obj as AssignUserViewModel;
if (usr == null)
return false;
return this.Id.Equals(usr.Id);
}
}
否则,如果您不能/不想更改类实现,您可以实现IEqualityComparer<>
并将其传递给Except
方法,例如:
class AssignUserViewModelEqualityComparer : IEqualityComparer<AssignUserViewModel>
{
public bool Equals(AssignUserViewModel x, AssignUserViewModel y)
{
if (object.ReferenceEquals(x, y))
return true;
if(x == null || y == null)
return false;
return x.Id.Equals(y.Id);
}
public int GetHashCode(AssignUserViewModel obj)
{
return obj.Id.GetHashCode();
}
}
那么你的最后一行将变成:
assignUsers = assignUsers.Except(assignedUsers, new AssignUserViewModelEqualityComparer()).ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)