如何在不同类型的集合中使用Except方法?
不同类型集合实现类似Except的逻辑
对于相同类型的集合,我们可以直接用Except()方法,比如:
var list1 = new List<int> { 1 , 2 , 3 , 5 , 9 }; var list2 = new List<int> { 4 , 3 , 9 }; var expectedList = list1.Except(list2); // 结果: { 1 , 2 , 5 }
但面对不同类型的集合(比如Cat和Dog),直接调用Except()会因类型不匹配报错,以下是两种可行的实现方式:
方法一:投影到相同类型后使用Except
先把两个不同类型的集合投影为相同的匿名类型(或自定义DTO),再调用Except()实现差集逻辑:
// 定义基础类 public class Cat { public string Name { get; set; } public int Age { get; set; } } public class Dog { public string Name { get; set; } public int Age { get; set; } } // 使用示例 var cats = new List<Cat> { new Cat { Name = "咪咪", Age = 2 }, new Cat { Name = "花花", Age = 3 }, new Cat { Name = "小黑", Age = 1 } }; var dogs = new List<Dog> { new Dog { Name = "花花", Age = 3 }, new Dog { Name = "旺财", Age = 2 } }; // 投影后取差集,再映射回Cat类型 var exceptCats = cats .Select(c => new { c.Name, c.Age }) .Except(dogs.Select(d => new { d.Name, d.Age })) .Join(cats, anon => new { anon.Name, anon.Age }, cat => new { cat.Name, cat.Age }, (_, cat) => cat); // 结果:包含Name为"咪咪"、"小黑"的Cat对象
方法二:用Where + Any模拟Except逻辑
直接通过Where过滤掉在dogs集合中存在匹配条件的cat,逻辑更直观:
var exceptCats = cats.Where(cat => !dogs.Any(dog => cat.Age == dog.Age && cat.Name == dog.Name)); // 结果:包含Name为"咪咪"、"小黑"的Cat对象
两种方法各有适用场景:
- 投影法适合需要复用匹配逻辑,或后续要对投影类型做额外操作的场景;
- Where+Any写法简洁直接,适合简单的匹配需求。
内容的提问来源于stack exchange,提问作者少強甘
相关产品推荐
相关产品推荐

