2016-03-05 114 views
2

我无法围绕如何创建此查询。如果项目Cats列表包含的Cat对象与List2中其中一个Cat的ID相匹配,我需要选择列表1中的项目。这可能吗?谢谢LINQ select list子列表包含来自另一个列表的项目

List1<pet> List1 = new List<pet>(100); 
List2<cat> List2 = new List<cat>(30); 

//populate lists, some of the items in List2 (cat) will be in the List1 items Cats list 

//classes 
class pet{ 
    string ID; 
    List<cat> Cats; 
} 

class cat { 
    string ID; 
    string name; 
} 

回答

10

你可以用下面的LINQ表达式:

List1.Where(p => p.Cats.Any(c => List2.Any(c2 => c2.ID == c.ID))); 

你也应该能够做到这一点与相交(也就是说,如果你的类有他们Equals方法重写来检查匹配ID - 见Intersect on MSDN):

List1.Where(p => p.Cats.Intersect(List2).Any()) 
+0

我有我的equals方法重写检查匹配的ID,这是更有效? – user2704766

+0

在没有匹配的情况下,相交一个会更快(无论如何,任何情况都必须通过整个集合)。当有很多可能的匹配时,任何事情都会变得更快(因为它只发生一次匹配后就会停止)。我只给你了相交变体,因为在我看来它看起来更漂亮。 –

+0

谢谢你,你和Alexanders都工作得很好! – user2704766

1

试试这个

var naughtycats = List1.Where(pet => List2.Select(cat => cat.ID).Contains(pet.ID)); 
+0

使用select可以做额外的工作 - 在检查之前将每个对象转换为它的ID,但只需要一次匹配。在这种情况下使用Any()是最优的。 –

4

这应该与嵌套Any工作:

var result = List1.Where(p => List2.Any(l => p.Cats.Any(c => c.ID == l.ID))); 
+0

谢谢,它正在工作! – user2704766

+0

@ user2704766不客气! –

相关问题