C#如何判断已创建的List集合中是否存在含指定Email的Professional对象
实现方案
你现有代码的问题:List<T>.Contains() 方法默认判断的是整个对象的引用相等,不能直接匹配对象的单个Email属性,而且你原有的判断逻辑写反了:如果邮箱存在才新增,这和你要的「存在就拦截、不存在才新增」的需求刚好相反。
方案1:用LINQ的Any方法(最便捷)
首先需要在代码顶部引入LINQ命名空间:
using System.Linq;
然后修改Create方法的校验逻辑如下,还可以加邮箱忽略大小写的匹配规则,符合实际业务中邮箱不区分大小写的通用规则:
public void Create() { // 先判断列表中是否已经存在相同邮箱的记录 bool isEmailExists = lprofessional.Any(p => p.Email.Equals(Email, StringComparison.OrdinalIgnoreCase) ); // 只有邮箱不存在的时候才新增 if (!isEmailExists) { Professional pro = new Professional(role_id, First_name, Last_name, Email, Phone, Description); lprofessional.Add(pro); role_id++; } else { // 此处可添加邮箱重复的异常提示/返回逻辑 } }
方案2:重写相等判断逻辑(适合频繁查重场景)
如果你需要经常判断Professional对象的重复性,可以直接重写Equals和GetHashCode方法,或者实现IEquatable<Professional>接口,之后直接用Contains方法就能按你指定的规则判断:
public class Professional : IEquatable<Professional> { public int Role_id { get; set; } public string First_name { get; set; } public string Last_name { get; set; } public string Email { get; set; } public string Phone { get; set; } public string Description { get; set; } public Professional(int role_id, string firstname, string lastname, string email, string phone, string description) { this.Role_id = role_id; this.First_name = firstname; this.Last_name = lastname; this.Email = email; this.Phone = phone; this.Description = description; } public bool Equals(Professional other) { if (other == null) return false; return Email.Equals(other.Email, StringComparison.OrdinalIgnoreCase); } public override bool Equals(object obj) { return Equals(obj as Professional); } public override int GetHashCode() { return Email.ToLower().GetHashCode(); } }
之后你的校验逻辑可以直接写:
public void Create() { Professional pro = new Professional(role_id, First_name, Last_name, Email, Phone, Description); if (!lprofessional.Contains(pro)) { lprofessional.Add(pro); role_id++; } }
方案3:用HashSet优化性能(适合数据量较大场景)
如果你的列表数据量很大,频繁查重的话List的Any或Contains都是O(n)时间复杂度,可以换成HashSet<Professional>,配合上面重写的相等逻辑,查重是O(1)时间复杂度,性能更高。
内容的提问来源于stack exchange,提问作者Leonardo Cani Schumann
相关产品推荐
相关产品推荐

