C# LINQ在共享公共属性的不同OBJ的数据表中查找OBJ列表

C# LINQ在共享公共属性的不同OBJ的数据表中查找OBJ列表,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有一个列表A是obj A,列表B是obj B。这两个列表共享一个属性,我想在A中查找列表B中的所有obj B并将其拉出 所以,前 名单A是一群人 清单B是一堆名字 两个列表都有一个personId 现在我想让名单B中的所有人都知道。我在想a: class names { public int id {get;set;} public string name {get;set;} } class people { public int id {get;set;}

我有一个列表A是obj A,列表B是obj B。这两个列表共享一个属性,我想在A中查找列表B中的所有obj B并将其拉出

所以,前

名单A是一群人

清单B是一堆名字

两个列表都有一个personId

现在我想让名单B中的所有人都知道。我在想a:

class names 
{
    public int id {get;set;}
    public string name {get;set;}
}

class people
{
    public int id {get;set;}
    public string name {get;set;}
}

    var newList = new List<person>();

    foreach(var n in names)
    {
        var person = people.firstordefault(p => p.name == n);
        if(person!=null)
        {    
            newList.Add(person);
        }
    }
}
类名
{
公共int id{get;set;}
公共字符串名称{get;set;}
}
阶级人士
{
公共int id{get;set;}
公共字符串名称{get;set;}
}
var newList=新列表();
foreach(名称中的变量n)
{
var person=people.firstordefault(p=>p.name==n);
if(person!=null)
{    
新增列表。添加(人);
}
}
}
我想知道LINQ有没有更有效的方法我可以这样做,因为它不会每次都是一个列表,它可能是我调用它的数据库,我不想无缘无故地调用数据库数千


如果我仔细想想,这可能是一个糟糕的例子。

使用LINQ,您可以做到:

var intersection = ListA.Intersect(ListB);
但是,这是集合交集,这意味着如果ListA和ListB中没有唯一的值,则不会获得任何副本。换句话说,如果您具备以下条件:

var ListA = new [] { 0, 0, 1, 2, 3 };
var ListB = new [] { 0, 0, 0, 2 };
然后ListA.Intersect(ListB)生成:

{ 0, 2 }
如果您正在期待:

{ 0, 0, 2 }

然后,您必须自己维护项目计数,并在扫描这两个列表时进行产量/减量。

因为您处理的是两个不同的类,所以您真正需要的是一个联接

List<Person> people = new List<Person>{new Person{Name = "Mark"}, 
                                       new Person{Name = "Alice"}, 
                                       new Person{Name = "Jane"}};

List<string> names = new List<string>{"Mark"};

var query = from p in people
            join n in names on p.Name equals n
            select p; // will output Person Mark
List people=newlist{new Person{Name=“Mark”},
新人{Name=“Alice”},
新人{Name=“Jane”};
列表名称=新列表{“标记”};
var query=来自人中的p
在p上的名称中加入n。名称等于n
选择p;//将输出个人标记
注意:这具有O(p+n)的时间复杂度(其中p=人数,n=姓名数量),因为join是作为散列连接实现的。上面的嵌套循环或Where/包含LINQ查询时间复杂性O(p*n),因为它对每个p迭代n次。这可能是问题,也可能不是问题,具体取决于您收藏的大小。

此代码:

var newList = new List<person>();
foreach(var n in names)
{
    var person = people.firstordefault(p => p.name == n);
   if(person!=null)
   {    
      newList.Add(person);
   }
}

这与我所寻找的非常接近,但是如果名称是一个名称obj列表,并且其中一个属性是匹配p.name所需的字符串值,该怎么办?我用classeschange
names.Contains(p.name)
to
names.Select(o=>o.stringProperty).Contains(p.name)
var newList = new List<person>();
newList = people.Where(p => names.Contains(p.name)).ToList();
newList = people.Where(p => names.Select(o => o.name).Contains(p.name)).ToList();