c# - 获取第二个不同类型列表中缺少的元素

标签 c# .net linq

我有两种不同类型的列表:

List<class1> list1;
List<class2> list2;

两个实体都有一个名为 Id 的相同属性。 list1 包含 10 个元素,list2 包含 200 个元素。

我需要根据字段Id获取list1中不在list2中的元素列表。

我知道有一个名为 Except 的 Linq 运算符, 但它仅适用于同一类型的两个元素,并假设实体的所有字段都相等。

最佳答案

随着列表规模的增长,给出的其他答案将无法很好地扩展。提高性能的一个简单更改是将异常列表转换为 HashSet。如果 Id 属性是一个整数,它看起来像这样:

var exceptIds = new HashSet<int>(list2.Select(y => y.Id).Distinct());
var unmatched = list1.Where(x => !exceptIds.Contains(x.Id)).ToList();
unmatched.Dump(); // LinqPad method, to see output

如果 Id 的类型是其他类型,只需将其作为泛型类型参数替换到第一行即可。

或者,您可以使用左连接技术生成相同的不匹配输出,很像 SQL 中的“查找不匹配记录”查询。

var unmatched = (from item in list1
                join item2 in list2 on item.Id equals item2.Id into grp
                from x in grp.DefaultIfEmpty()
                where x == null
                select item).ToList();

关于c# - 获取第二个不同类型列表中缺少的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37742120/

相关文章:

c# - 使用 Linq 将 xml 转换为类

c# - 如何获取使用 facebook 注册应用程序注册我的网站的 facebook 用户的个人资料照片(不使用 mvc)

c# - 提交 url 时不带任何特殊字符

c# - 为什么覆盖 XML 文件会创建额外的结束标记?

c# - Selenium C# 的第二个测试方法失败

c# - Any<T>的相反方法是什么

linq - Linq 中的 IGrouping 和 Casting

c# - 找不到 Microsoft.SqlServer.Types 的版本 10 或更高版本

c# - 如何对使用 Response.OnStarting 的 .NET 中间件进行单元测试

c# - 如何从动态加载的程序集中加载包含嵌套类型的泛型类型?