Skip to main content
 首页 » 编程设计

c#之在 C# 中的 2 个集合之间相交

2024年05月10日36artech

我有:

            List<INFRAESTRUCTURA> l1 = listQ1.ToList(); 
            List<INFRAESTRUCTURA> l2 = listQ2.ToList(); 

我需要比较它的 id。类似的东西:

 l1.Intersect(l2, l1[].id_infraestructura == l2[].id_infraestructura)  

但我不知道我必须使用哪种方法及其语法。

我发现了这个:

var ids = list1.Select(a => a.id).Intersect(list2.Select(b => b.id)); 

但这会返回一个 id 列表,我需要一个包含在两个列表中的元素列表。

谢谢!

请您参考如下方法:

我会使用 Enumerable.Join :

var intersecting = from i1 in l1 
                   join i2 in l2 
                   on i1.id_infraestructura equals i2.id_infraestructura 
                   select i1; 
List<INFRAESTRUCTURA> result = intersecting.ToList(); 

如果您要覆盖 Equals + GetHashCode在INFRAESTRUCTURA或提供自定义 IEqualityComparer<INFRAESTRUCTURA>你可以使用 Enumerable.Intersect直接:

List<INFRAESTRUCTURA> result = l1.Intersect(l2).ToList(); 

这是一个可能的实现:

public class InfrastructureComparer : IEqualityComparer<INFRAESTRUCTURA> 
{ 
    public bool Equals(INFRAESTRUCTURA x, INFRAESTRUCTURA y) 
    { 
        if (x == null && y == null) return true; 
        if (x == null || y == null) return false; 
        return x.id_infraestructura == y.id_infraestructura; 
    } 
 
    public int GetHashCode(INFRAESTRUCTURA obj) 
    { 
        if (obj == null) return 0; 
        return obj.id_infraestructura; 
    } 
} 

您可以使用带 IEqualityComparer<T> 的重载像这里:

List<INFRAESTRUCTURA> result = l1.Intersect(l2, new InfrastructureComparer()).ToList(); 

如果你想要结果中的两个对象,你可以使用匿名类型:

var intersecting = from i1 in l1 
                   join i2 in l2 
                   on i1.id_infraestructura equals i2.id_infraestructura 
                   select new { i1, i2 };