C#实现值不存在时才添加元素 解决Add方法重复存值问题
问题根因
你当前使用的普通集合(如List<T>)的Add()方法默认不做重复值校验,只要调用就会将元素追加到集合末尾,多次执行value.Add(subject.english);时,即使值相同也会重复存入,最终出现Count为2、两个元素均为10的现象。
实现方式
根据你的业务场景选以下任意一种方案即可:
方案1:使用天然支持去重的
HashSet<T>(推荐)HashSet<T>是专门为存储唯一值设计的集合类型,添加元素时会自动判断值是否已存在,重复值会被直接忽略,无需额外写判断逻辑:// 将原集合定义替换为HashSet,以存储int类型值为例 HashSet<int> value = new HashSet<int>(); // 原有Add逻辑无需修改,多次添加相同值也只会保留一份 value.Add(subject.english); value.Add(subject.english); // 最终value.Count为1,仅存储一个10补充:
HashSet<T>.Add()方法返回bool类型结果,返回true代表添加成功(值之前不存在),返回false代表值已重复、未执行添加,可按需用该返回值做后续逻辑处理。方案2:保留原有
List<T>集合,添加前手动判重
如果你因为业务需求必须使用List<T>(比如需要按索引访问元素、严格保留自定义插入顺序),可以在执行Add前先判断值是否已存在:// 仅当值不存在时才执行添加 if (!value.Contains(subject.english)) { value.Add(subject.english); }注意:如果集合存储的是自定义引用类型对象,
Contains()默认按对象引用地址判断相等,若需要按对象属性值判重,需要重写对应类型的Equals()和GetHashCode()方法,或传入自定义相等比较器。方案3:批量添加完成后统一去重(不推荐常规使用)
如果是批量导入数据后需要一次性清理重复值,可以在所有Add操作完成后调用LINQ的去重方法:using System.Linq; // 所有添加操作结束后执行,得到去重后的集合 value = value.Distinct().ToList();该方案属于事后处理,相比添加环节就拦截重复值的方案性能更低,仅适合临时处理存量重复数据的场景。
内容的提问来源于stack exchange,提问作者Sean Davis
相关产品推荐
相关产品推荐

