如何从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 -
相关产品推荐
相关产品推荐

