c# - 使用 LINQ 仅基于单个对象属性获取两个对象列表之间的差异

标签 c# linq linq-to-objects

<分区>

狗类有两个属性(名字和颜色)

假设我有两个 IEnumerable 列表:

List1 [{name="Sam", color="Fawn"}, {name="Mary", color=""}, {name="Bob", color=""}]
List2 [{name="Mary", color="Black"},{name="Bob", 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;

我可能是个彻头彻尾的白痴,但我已经盯着它看了一整天了,却无法理解。任何帮助将不胜感激。

最佳答案

在功能上您拥有的是 Except,但您不想使用整个项目的相等性,而是希望使用选定的属性作为键来执行 Except。虽然您可以为仅比较名称的 Except 提供自定义 IEqualityComparer,但编写该比较器是相当容易出错的样板代码。我们可以编写一个方法来相当容易地对投影键执行 Except:

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

这会使用给定的键执行 except,而不是自定义相等比较器。

现在您的查询很简单:

var query = list1.ExceptBy(list2, dog => dog.name);

关于c# - 使用 LINQ 仅基于单个对象属性获取两个对象列表之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28224156/

相关文章:

c# - 隐式 'this'无法引用Xamarin中的扩展方法

LINQ 查询语法到方法语法

c# - LINQ 身份函数

c# - LINQ OrderBy 子句 - 强制特定字符串始终位于顶部

c# - LINQ GroupBy 连续时间

c# - Linq TotalCount 为 "Grandchildren",具有空检查和属性筛选器

c# - 使用 DI/抽象工厂模式时的依赖关系处理

c# - 我如何在 Xcode 中开发 C#?

c# - WPF(C#) 如何使用post请求传输文件?

c# - Linq SQL GroupJoin 错误