【发布时间】:2019-09-03 19:18:36
【问题描述】:
我正在尝试按 Email 属性对常见对象的列表进行分组,但没有得到我期望的结果。
var users = new List<Profile>
{
new SharePointProfile
{
Id = 1,
LoginName = "Login1",
Title = "Login1 SharePoint",
Email = "Login1@sharepoint.com",
IsSiteAdmin = false
},
new SharePointProfile
{
Id = 2,
LoginName = "Login2",
Title = "Login2 SharePoint",
Email = "Login2@sharepoint.com",
IsSiteAdmin = true
},
new Auth0Profile
{
Email = "Login2@sharepoint.com",
Name = "Login2 SharePoint Auth0"
},
new Auth0Profile
{
Email = "test@test.com",
Name = "Test User Auth0"
}
};
var userGroups = users.GroupBy(m => m.Email)
我希望看到三个组:
- 组 #1 - Login1@sharepoint.com - 1 个 SharePointProfile 对象
- 第 2 组 - Login2@sharepoint.com - 1 个 SharePointProfile 对象和 1 个 Auth0Profile 对象
- 第 3 组 - test@test.com - 1 个 Auth0Profile 对象
我在这里做错了什么?
public abstract class Profile : IEquatable<Profile>
{
public string Name { get; set; }
public string Email { get; set; }
public bool Equals(Profile other)
{
return this.Email == other.Email;
}
}
public class Auth0Profile : Profile
{
public new string Email { get; set; }
public new string Name { get; set; }
public string Connection { get; set; }
public string Password { get; set; }
public bool VerifyEmail { get; set; }
}
public class SharePointProfile : Profile
{
public int Id { get; set; }
public string LoginName { get; set; }
public string Title { get; set; }
public new string Email { get; set; }
public bool IsSiteAdmin { get; set; }
}
【问题讨论】:
-
您能否发布您的 3 个类(Profile、SharePointProfile 和 Auth0Profile)的(缩短)版本?是否有任何覆盖/操作子类中的电子邮件属性?
-
@gunr2171 感谢您的评论。我已经添加了这些,以便您查看。
-
幽默,请注释掉 Auth0Profile 和 SharePointProfile(但不是 Profile)中的电子邮件属性,然后再试一次。
-
是的,事实上您在属性中使用了
new。我对此没有很好的解释,所以有人可以在这里跳出来并做出更好的回答。底线 - 如果没有充分的理由,请勿在属性(或继承)中使用new。 -
当您添加
new时,它会创建一个与基类的Email属性完全无关的新属性(也称为Email)。通过摆脱new版本,您的所有类现在都具有相同的Email属性,因此它们的实例可以正确地组合在一起。如果您离开new,您的子类将有两个不相关的Email属性,一个可通过base.Email访问,另一个可通过this.Email访问。你可以不同地设置它们