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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:49:57