如何从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
相关产品推荐
相关产品推荐

