Lambda表达式将匹配两个集合

时间:2013-12-02 22:26:14

标签: c# linq

我正在使用实体框架,我需要一个lambda表达式的示例,如果collection1中的项目在collection2中,它将返回true。

例如,我想知道学生和老师是否在同一个班级。每个都有一组与它们相关的类。

这是C#实体框架5。

此类关系的数学术语是我自己将来参考或搜索的。 (联合,交叉等)。

3 个答案:

答案 0 :(得分:2)

您正在寻找的方法称为Intersect。您可以使用Any()链接它以检查是否至少有一个属于两个集合的元素:

collection1.Intersect(collection2).Any();

答案 1 :(得分:1)

考虑到这样的事情:

class Class
{
}

class Teacher
{
  public Class[] Classes { get ; }
}

class Student
{
  public Class[] Classes { get ; }
}

class ClassComparer : IEqualityComparer<Class>
{
  public bool Equals( Class x , Class y )
  {
    // your implementation here
  }
  public int GetHashCode( Class obj )
  {
    // your implementation here
  }
}

然后像这样的代码就足够了:

Teacher teacher = ... ;
Student student = ... ;
ClassComparer classComparer = new ClassComparer() ;

bool shareAClass = teacher
                   .Classes
                   .Any( c => student.Classes.Contains(c,classComparer) )
                   ;

虽然你应该牢记你的收藏品的语义。如果它们是数组(就像在这个例子中那样),弄清楚教师和学生是否共享一个类是O(N 2 )操作。您可能想重新考虑实现。

答案 2 :(得分:0)

您想要使用Intersect方法,但听起来您遇到的问题在于定义相等性。平等是任意的,当你c1.Interstect(c2).ToList()进行比较时,你会比较&#34;参考平等&#34;意思是它返回一个集合,引用两个集合引用的对象。

您可能想要做的是实施IEqualityComparer http://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx wg

有一个交叉过载,它也会将你的相等比较器作为一个参数,然后你可以产生你关心的值的交集。例如,您可以拥有Person对象,其中包含字符串firstlast属性,如果lhs.first + lhs.last == rhs.first + rhs.last {l}和rhs是Person类型的实例,则认为对象相等。如果你想要像这样的任何自定义的相等定义(你的问题让我相信你这样做),那么你需要实现一个IEqualityComparer来使用像Intersect这样的方法。< / p>