我有:
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 };
