C#代码求助:使用Except方法无法得到预期的List结果
解决C#中保留重复元素的列表差集问题
你当前代码里的Except方法是基于集合语义的——它会自动去重,把两个序列都当作无重复元素的集合来计算差集。所以list里的两个1会被合并成一个,和list1里的1对比后,所有1都会被排除,最终得到空列表,这就是达不到预期的原因。
要实现“移除两个列表中相同次数的共同元素,保留剩余重复项”的需求,有两种常用方案:
方案一:基于元素计数的LINQ实现
适合处理数据量较大的场景,效率更高:
List<int> list = new List<int>() { 1,1,2}; List<int> list1= new List<int>() { 1, 2 }; // 统计两个列表中各元素的出现次数 var listElementCounts = list.GroupBy(x => x) .ToDictionary(group => group.Key, group => group.Count()); var list1ElementCounts = list1.GroupBy(x => x) .ToDictionary(group => group.Key, group => group.Count()); var result = new List<int>(); foreach (var (element, countInList) in listElementCounts) { // 获取该元素在list1中的出现次数,不存在则为0 list1ElementCounts.TryGetValue(element, out int countInList1); // 计算剩余需要保留的元素个数 int remainingCount = countInList - countInList1; if (remainingCount > 0) { result.AddRange(Enumerable.Repeat(element, remainingCount)); } } foreach(int item in result) { Console.WriteLine(item); }
方案二:遍历移除(直观简单)
适合小列表场景,逻辑易懂:
List<int> list = new List<int>() { 1,1,2}; List<int> list1= new List<int>() { 1, 2 }; // 必须创建原列表的副本,否则会修改原list var result = new List<int>(list); foreach (var item in list1) { // 每次只移除一个匹配的元素 result.Remove(item); } foreach(int item in result) { Console.WriteLine(item); }
两种方案最终都会输出1,符合你的预期。
内容的提问来源于stack exchange,提问作者User1234
相关产品推荐
相关产品推荐

