加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读