我正在使用实体框架,我需要一个lambda表达式的示例,如果collection1中的项目在collection2中,它将返回true。
例如,我想知道学生和老师是否在同一个班级。每个都有一组与它们相关的类。
这是C#实体框架5。
此类关系的数学术语是我自己将来参考或搜索的。 (联合,交叉等)。
答案 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
对象,其中包含字符串first
和last
属性,如果lhs.first + lhs.last == rhs.first + rhs.last
{l}和rhs是Person
类型的实例,则认为对象相等。如果你想要像这样的任何自定义的相等定义(你的问题让我相信你这样做),那么你需要实现一个IEqualityComparer
来使用像Intersect
这样的方法。< / p>