c# – 使用LINQ仅根据单个对象属性获取两个对象列表之间的差异
发布时间:2020-12-15 23:45:30 所属栏目:百科 来源:网络整理
导读:狗类有两个属性(名称和颜色) 假设我有两个IEnumerable列表: List1 [{name="Sam",color="Fawn"},{name="Mary",color=""},{name="Bob",color=""}]List2 [{name="Mary",color="Black"},color="Yellow"}] 我想得到一个只在名称上有所不同的狗对象列表 所以我的
狗类有两个属性(名称和颜色)
假设我有两个IEnumerable列表: List1 [{name="Sam",color="Fawn"},{name="Mary",color=""},{name="Bob",color=""}] List2 [{name="Mary",color="Black"},color="Yellow"}] 我想得到一个只在名称上有所不同的狗对象列表 所以我的返回列表看起来像 ListReturn: [{name="Sam",color="Fawn"}] 合理? 我想用linq做这件事.这就是我尝试过的……而且它不起作用 var missing = from l1 in List1 join l2 in List2 on l1.Name equals l2.Name into merged from missed in merged.DefaultIfEmpty() select missed; 我可能是一个完整的白痴,但我整天盯着这一点,却无法得到它.任何帮助,将不胜感激. 解决方法
你拥有的是功能除外,但是你想要使用一个选定的属性作为关键字,而不是使用整个项目的相等性.虽然您可以提供自定义IEqualityComparer,除了只比较名称,编写该比较器是一个容易出错的样板代码.我们可以编写一种方法,可以非常轻松地对投影键执行以下操作:
public static IEnumerable<TSource> ExceptBy<TSource,TKey>( this IEnumerable<TSource> source,IEnumerable<TSource> other,Func<TSource,TKey> keySelector) { var set = new HashSet<TKey>(other.Select(keySelector)); foreach(var item in source) if(set.Add(keySelector(item))) yield return item; } 这将执行除使用给定键之外的其他键,而不是自定义相等比较器. 现在你的查询很简单: var query = list1.ExceptBy(list2,dog => dog.name); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |