调用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
相关产品推荐
相关产品推荐

