如何交叉两个不同的IEnumerable集合

我认为这个问题之前已经被问到,但我还没有能够推断出一个明确的答案。 我试图找到最好的方式(或一种方式)来交叉两个完全不同的可相关集合。

A类:

  • int z1
  • int z2
  • int z3
  • 字符串z4

B级:

  • int j5
  • int j6
  • T j7
  • T j8
  • 字符串j9

..我想在z2 == j6上将ListList相交。

可以这样做吗?

这个问题没有意义 – 结果类型是什么? 必须在两个相同类型的序列上执行交叉。 听起来你不太想要两组之间的交集,作为基于z2的可能值的第一序列的filter。 例如:

 HashSet validZ2 = new HashSet(listB.Select(x => x.j6)); var filtered = listA.Where(x => validZ2.Contains(x.z2)); 

或者可能像Gabe建议的那样,你想要加入。 例如:

 var query = from a in listA join b in listB on a.z2 equals b.j6 select new { a, b }; 

这将为您提供两个匹配z2 / j6的列表中的所有值对。

您需要实现自定义相等比较器(请参阅IEqualityComparer >接口)以将其作为第二个参数传递给Intersect()

通过使用intersect方法,您可以在两个枚举之间获得通用成员,如下例所示:

 [Test] public void TestObjectIntersect() { var a = new List { 1, 2, 3, "test", "test2" }; var b = new List { 4, 5, 1, "test2" }; var c = a.Intersect(b); Console.WriteLine(String.Join(",", c.Select(x => x.ToString()).ToArray())); } 
 class Program { static void Main(string[] args) { var aList = (from item in Enumerable.Range(1, 10) select new A { Z1 = item, Z2 = item * 2 }).ToList(); var bList = (from item in Enumerable.Range(10, 100) select new B { J5 = item, J6 = item / 2 }).ToList(); var intersect = (from a in aList join b in bList on a.Z2 equals b.J6 select new { A = a, B = b }).ToList(); foreach (var item in intersect) { Console.WriteLine("A:{{{0}}}, B:{{{1}}}", item.A, item.B); } } } public class A { public int Z1 { get; set; } public int Z2 { get; set; } // other fields and properties public override string ToString() { return string.Format("Z1={0}, Z2={1}", Z1, Z2); } } public class B { public int J5 { get; set; } public int J6 { get; set; } // other fields and properties public override string ToString() { return string.Format("J5={0}, J6={1}", J5, J6); } }