我有两个自定义对象列表,我想得到它们的交集,但我想要一个稍微复杂的方法来确定相等。
简化示例:
public class MyClass {
public string Property1 { get; set; }
public string Property2 { get; set; }
public string Property3 { get; set; }
}
我希望得到两个List<MyClass>
的交集,其中MyClass a&amp;如果a.Property1 == b.Property1 && (a.Property2 == b.Property2 || a.Property3 == b.Property3)
,则b被视为相等。更具体地说,我想要一种简洁的方式来获得它们的交集。
IEnumerable.Intersect()要求我去写一个额外的类来处理比较,因为它不需要lambda。
我是新手LINQ语法,但我无法弄清楚如何编写更复杂的join ... on ... equals ...
子句来处理上述属性比较。
我应该做更像list1.Where(a => list2.Select("Property1 = " + a.Property1 + "...").Count == 1)
的事情吗?
答案 0 :(得分:0)
所以,你想要一个复杂的连接关系。最简单的方法是进行完全连接,然后过滤有趣的项目
var results = from left in sequence1
from right in sequence2 // This is a cross join
where (left.Property1 == right.Property1) &&
(left.Property2 == right.Property2 || left.Property3 == right.Property3)
select new { left, right };
但是,在这种特定情况下,您实际上正在对常规内部联接进行额外过滤:
var results = from left in sequence1
join right in sequence2 on left.Property1 equals right.Property1
where (left.Property2 == right.Property2 || left.Property3 == right.Property3)
select new { left, right };