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

调用Except方法处理泛型列表时,如何避免自动去重?

问题原因

Except()方法的设计逻辑是返回两个序列的去重差集,它内部会通过哈希集合处理源序列和排除序列,自动剔除重复元素,所以哪怕源序列有重复项,最终结果也只会保留唯一值。

解决办法

方法一:用Where替代(适合排除集合为空的场景)

直接通过Where过滤掉排除集合中的元素,这种方式会完整保留源序列的所有元素(包括重复项):

var list = new List<string>(){"Item1","Item1"}; 
var emptyList = new List<string>();
var result = list.Where(item => !emptyList.Contains(item));

执行后result会包含两个"Item1",符合预期。

方法二:自定义保留重复项的差集扩展方法(通用场景)

如果后续排除集合可能不为空,且需要保留源序列的重复项,可以自己实现一个扩展方法:

public static class EnumerableExtensions
{
    public static IEnumerable<T> ExceptWithDuplicates<T>(this IEnumerable<T> source, IEnumerable<T> exclude)
    {
        var excludeItems = new HashSet<T>(exclude);
        foreach (var item in source)
        {
            if (!excludeItems.Contains(item))
            {
                yield return item;
            }
        }
    }
}

调用方式和原Except类似:

var result = list.ExceptWithDuplicates(emptyList);

这个方法会遍历源序列的每一个元素,仅跳过存在于排除集合中的项,完全保留源序列的重复元素。

内容的提问来源于stack exchange,提问作者Masoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:20:32