You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:18:00