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

如何在不同类型的集合中使用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,提问作者少強甘

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:29:56