C#中如何比较两个对象列表多属性并返回符合条件的匹配项?
问题分析与解决方案
原代码错误原因
你的代码逻辑完全偏离需求,存在两处核心错误:
list2.Where(y => y.Name).FirstOrDefault():此代码是筛选Name属性非空/非空白的MyObject实例,取第一个后直接和x.Name(字符串类型)比较,不仅类型不匹配(编译器应提示错误),也没有实现"找同Name对象"的逻辑。list2.Where(y => y.Value).FirstOrDefault():此代码是筛选Value属性非0的MyObject实例,取第一个后和x.Value(整数类型)比较,同样类型错误,且未对应"和同Name对象比Value"的需求。
这种错误逻辑只会偶然匹配到第一个符合错误条件的对象,自然无法返回所有预期结果。
正确解决方案
方案一:使用Where + Any(简洁直观)
通过Any检查list2中是否存在同Name且Value更小的对象,筛选出list1中满足条件的所有元素:
var results = list1.Where(x => list2.Any(y => y.Name == x.Name && x.Value > y.Value)).ToList();
方案二:使用Join + 去重(性能更优,适合大数据量)
先按Name关联两个列表,再筛选Value符合条件的项,最后去重避免list2中有多个同Name对象时重复返回list1的同一元素:
var results = list1.Join( list2, x => x.Name, // list1的关联键:Name y => y.Name, // list2的关联键:Name (x, y) => new { List1Obj = x, List2Obj = y } ) .Where(pair => pair.List1Obj.Value > pair.List2Obj.Value) .Select(pair => pair.List1Obj) .Distinct() .ToList();
内容的提问来源于stack exchange,提问作者MintBerryCRUNCH
相关产品推荐
相关产品推荐

