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

如何从dataBefore过滤出与dataAfter的Name和SectionId不匹配的数据?

解决方法:取反匹配条件即可

嘿,你现在的问题是原查询正好做了相反的操作——它找出了dataBefore里在dataAfter存在对应Name+SectionId组合的项,而我们需要的是不存在的项,只要加个取反符号!就能搞定!

修正后的查询代码

var x = dataBefore.Where(y => !dataAfter.Any(z => z.Name == y.Name && z.SectionId == y.SectionId)).ToList();

为什么这样改?

你原代码里的dataAfter.Any(z => ...)会返回true当且仅当dataAfter中存在和当前y的Name、SectionId完全匹配的项。Where会保留所有让条件为true的元素,所以原代码只返回了N3(唯一完全匹配的项)。

加上!之后,条件变成:dataAfter中不存在任何和当前y的Name+SectionId完全匹配的项,这样就会筛选出你要的结果:

  • N1(SectionId为null):dataAfter里的N1对应SectionId是另一个Guid,不匹配,被保留
  • N2:dataAfter里没有同名且同SectionId的项,被保留
  • N4(SectionId为ca663d45-04b8-4c80-96b6-c3760352a6ac):dataAfter里的N4对应SectionId是null,不匹配,被保留
  • N3:完全匹配,被过滤掉

性能优化(可选)

如果你的集合数据量很大,每次Any都会遍历整个dataAfter,效率会比较低。可以先把dataAfter的Name+SectionId组合存入一个哈希集合,这样查找速度会快很多:

// 先把dataAfter的所有组合存入HashSet
var afterUniquePairs = new HashSet<(string Name, Guid? SectionId)>(
    dataAfter.Select(school => (school.Name, school.SectionId))
);

// 直接用Contains判断是否存在
var result = dataBefore.Where(school => !afterUniquePairs.Contains((school.Name, school.SectionId))).ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:07:54