使用复杂的相等比较获得两个列表的交集的简明方法?

时间:2013-11-22 20:30:42

标签: c# linq c#-3.0

我有两个自定义对象列表,我想得到它们的交集,但我想要一个稍微复杂的方法来确定相等。

简化示例:

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)的事情吗?

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 };