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

如何从Generic Array(泛型数组)中移除指定元素

泛型数组删除元素的实现方案

要实现DeleteStudent方法从泛型数组中移除指定元素,由于数组是固定长度结构,我们需要通过创建新数组存储保留元素的方式完成删除操作,以下是两种符合要求的实现方式:

方式一:手动遍历数组实现

完全通过数组原生操作完成,无需依赖LinQ,逻辑清晰可控:

public void DeleteStudent(T student)
{
    // 空数组直接返回,无需处理
    if (list.Length == 0) return;

    // 使用泛型默认相等比较器,兼容值类型和引用类型的相等判断
    var equalityComparer = EqualityComparer<T>.Default;
    
    // 统计需要保留的元素数量
    int keepCount = 0;
    foreach (var item in list)
    {
        if (!equalityComparer.Equals(item, student))
        {
            keepCount++;
        }
    }

    // 创建新数组并填充保留的元素
    T[] newStudentArray = new T[keepCount];
    int currentIndex = 0;
    foreach (var item in list)
    {
        if (!equalityComparer.Equals(item, student))
        {
            newStudentArray[currentIndex++] = item;
        }
    }

    // 替换原数组
    list = newStudentArray;
}

方式二:修正LinQ实现

你之前尝试LinQ无效,通常是因为没有使用正确的相等比较逻辑。以下是可正常工作的LinQ写法,最终仍返回数组,符合要求:

public void DeleteStudent(T student)
{
    // 通过LinQ过滤掉目标元素,再转为数组
    list = list.Where(item => !EqualityComparer<T>.Default.Equals(item, student)).ToArray();
}

关键注意点

对于Physical这类引用类型,默认相等比较是判断对象引用是否一致。如果需要根据属性值判断元素相等,需在Physical类中重写Equals和GetHashCode方法:

public class Physical
{
    public string Fio { get; set; }
    public string SportDiscipline { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Physical other)
        {
            return Fio == other.Fio && SportDiscipline == other.SportDiscipline;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Fio, SportDiscipline);
    }
}

内容的提问来源于stack exchange,提问作者Hehe_Boy -

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:00:22