C# LINQ确定集合中对象的属性是否存在于其他集合中

C# LINQ确定集合中对象的属性是否存在于其他集合中,c#,linq,C#,Linq,假设我有一组个人物品- public class Person { public string Firstname { get; set; } public string Surname { get; set; } } 现在让我们假设我有一个不同的收藏,保存着我邀请参加聚会的家庭的姓氏- var guestlist = new List<string> {"Stark", "Wayne"}; var guestlist=新列表{“斯塔克”、“韦恩”}; 我怎样才能使用l

假设我有一组个人物品-

public class Person
{
  public string Firstname { get; set; }
  public string Surname { get; set; }
}
现在让我们假设我有一个不同的收藏,保存着我邀请参加聚会的家庭的姓氏-

var guestlist = new List<string> {"Stark", "Wayne"};
var guestlist=新列表{“斯塔克”、“韦恩”};
我怎样才能使用linq(最好是基于lamba的,但这并不重要)来仅仅吸引斯塔克或韦恩家族的成员?也就是说,我想以另一个(第三个)收藏结束,而不仅仅是表明我的第一个收藏中有韦恩或斯塔克家族成员。

我会尝试以下方法:

var peopleList = GetPeopleList();
var guestList = new List<string> {"Stark", "Wayne"};
var matchList = peopleList.Where(o => guestList.Contains(o));
var peopleList=GetPeopleList();
var guestList=新列表{“斯塔克”、“韦恩”};
var matchList=peopleList.Where(o=>guestList.Contains(o));
试试这个:

var invited = persons.Where(p => guestlist.Contains(p.Surname));

这个操作在概念上是一个连接。它将两个不同集合中“属于”在一起的对象进行匹配

var query = from person in people
    join name in guestlist 
    on person.Surname equals name
    select person;
请注意,当两个集合的大小都很小时,所有涉及在人员列表中的每个项目的名称列表上使用
Contains
的其他解决方案都会起作用,但对于较大的集合,解决方案根本无法很好地扩展,因为您必须对每个项目进行线性搜索。一个连接,如果实现得当(LINQ就是这样做的),将把来宾列表放入一个可以更高效地搜索的集合中

var query = from person in people
    join name in guestlist 
    on person.Surname equals name
    select person;