LINQ选择列表:在子列表包含另一个列表中的项目

8

我无法理解如何创建这个查询。如果Cats列表中包含与List2中的某个Cat的ID匹配的Cat对象,则需要选择List 1中的项目。这是否可能?谢谢。

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;
}
3个回答

18

您可以使用以下的LINQ表达式:

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

如果你的类已经重写了它们的Equals方法以检查匹配的ID,那么你也可以使用Intersect来完成(参见MSDN上的交集操作):

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

我已经重写了我的equals方法来检查匹配的ID,哪种方法更有效? - user2704766
在没有匹配项的情况下,交集操作会更快(因为任何操作都必须遍历整个集合)。当存在大量可能的匹配项时,任何操作将更快(因为它在找到一个匹配项后就停止了)。我只提供了交集操作的变体,因为在我看来它更美观。 - MarengoHue
谢谢,你和亚历山大的都运行良好! - user2704766

4

这应该适用于嵌套的Any

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

1

试试这个

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

使用select会做额外的工作 - 在检查之前,您将每个对象转换为其ID,但您只需要一个匹配项。在这种情况下,使用Any()是最优选择。 - MarengoHue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接