C#中如何对比两个列表并移除已存在于另一列表的项
C# 列表差集实现方案
C# 内置了现成的方法,完全不需要手动写循环就能实现「移除当前列表中存在于另一列表的项」的需求,常用的有两种实现方式,根据你是否需要保留原列表选择即可。
方式1:生成新的结果列表(不修改原列表)
引入System.Linq命名空间后,直接用LINQ提供的Except()扩展方法即可,该方法会返回两个列表的差集,不会改动原始的两个列表数据:
using System.Linq; using System.Collections.Generic; // 业务示例 List<string> myList = new List<string> { "苹果", "香蕉", "橙子", "葡萄" }; List<string> itemsToRemove = new List<string> { "香蕉", "葡萄" }; // 一行代码得到排除后的结果 List<string> filteredList = myList.Except(itemsToRemove).ToList(); // filteredList 最终内容:["苹果", "橙子"]
注意:如果列表存储的是自定义类对象,你可以通过Except()的重载传入自定义相等比较器,或者给类实现IEquatable<T>接口来指定重复判断规则。
方式2:直接修改原列表
如果不需要保留原列表内容,可以直接用List<T>自带的RemoveAll()方法,传入匹配待移除项的判断条件即可,同样不需要手写循环:
// 直接在原列表上移除符合条件的项 myList.RemoveAll(item => itemsToRemove.Contains(item));
性能提示:如果待移除的列表数据量较大,建议先把待移除列表转为HashSet<T>再做包含判断,能把时间复杂度从O(nm)降到O(n),大幅提升执行效率:*
HashSet<string> removeSet = new HashSet<string>(itemsToRemove); myList.RemoveAll(item => removeSet.Contains(item));
内容的提问来源于stack exchange,提问作者Hasan Mills
相关产品推荐
相关产品推荐

