C# 优化linq查询以从两个列表中收集匹配对象

C# 优化linq查询以从两个列表中收集匹配对象,c#,.net,performance,linq,C#,.net,Performance,Linq,我有两个对象列表(列表1和列表2),我需要从列表1创建第三个对象列表,这些对象与列表2中的至少一个对象共享属性值。我创建了下面的linq查询来实现这一点,但是它非常慢(毫无疑问,这在很大程度上是因为两个起始列表最多可以包含200000个对象) 是否有一种更有效的方法在代码中实现这一点(可能不首先使用linq)?您可以使用linqJoin来实现这一点 查询语法: var result = (from obj1 in _list1 join obj2 in _list2 on

我有两个对象列表(列表1和列表2),我需要从列表1创建第三个对象列表,这些对象与列表2中的至少一个对象共享属性值。我创建了下面的linq查询来实现这一点,但是它非常慢(毫无疑问,这在很大程度上是因为两个起始列表最多可以包含200000个对象)


是否有一种更有效的方法在代码中实现这一点(可能不首先使用linq)?

您可以使用linq
Join
来实现这一点

查询语法:

var result = (from obj1 in _list1
            join obj2 in _list2 on obj1.SpecialId equals obj2.SpecialId
            select obj1
            ).ToList();
方法语法:

var result = _list1.Join(_list2, obj1 => obj1.Id, obj2 => obj2.Id, (obj1, obj2) => obj1).ToList();

根据我的简单测试,带有
Join
的版本大约比原始版本快5-6倍。

您可以使用LINQ
Join
来实现这一点

查询语法:

var result = (from obj1 in _list1
            join obj2 in _list2 on obj1.SpecialId equals obj2.SpecialId
            select obj1
            ).ToList();
方法语法:

var result = _list1.Join(_list2, obj1 => obj1.Id, obj2 => obj2.Id, (obj1, obj2) => obj1).ToList();

根据我的简单测试,带有
Join
的版本大约比原始版本快5-6倍。

制作一个
HashSet
(假设
SpecialId
int
)。循环
\u列表2
并将每个
SpecialId
添加到哈希集中。然后您的结果是
\u list1.Where(l=>!hashSet.Contains(l.SpecialId))SpecialId是一个很长的代码。你的建议仍然有效吗?@fyodorfranz是的,但你需要将hashset改为
hashset
@Rob太棒了!我已经实施了你的建议,一个曾经需要29秒的操作现在不知何故需要2秒。谢谢你的帮助。@fyodorfranz别担心,伙计:)做一个
HashSet
(假设
SpecialId
int
)。循环
\u列表2
并将每个
SpecialId
添加到哈希集中。然后您的结果是
\u list1.Where(l=>!hashSet.Contains(l.SpecialId))SpecialId是一个很长的代码。你的建议仍然有效吗?@fyodorfranz是的,但你需要将hashset改为
hashset
@Rob太棒了!我已经实施了你的建议,一个曾经需要29秒的操作现在不知何故需要2秒。谢谢你的帮助。@fyodorofranz别担心,伙计:)