LINQ 将集合 A 中的对象与集合 B 进行匹配

本文关键字:集合 对象 LINQ | 更新日期: 2023-09-27 18:31:42

假设我们有 2 组

A

= [ 人物 A,人物 B];

B = [ 经理Z,经理T,经理Y];

结果 : 经理 T,经理 Y

A 中的对象和 B 中的对象之间存在一对一映射。我对 B 中那些在 A 中存在此类条目的对象感兴趣。

为了完整起见,假设我们正在匹配名为 Name 的属性

LINQ 将集合 A 中的对象与集合 B 进行匹配

尝试关注

SetB.Where(b => SetA.Any(a => a.Name == b.Name))

您必须在两个列表上执行联接:

var query =
    from person in persons
    join manager in managers on person.Name equals manager.Name
    select new { Person = person, Manager = manager };

这将从Person数据集中选择所有数据以及Manager数据集中的相应数据。

或者,您可以将结果平展为数据类型,为每个匹配项提供完整数据:

    select new { Name = person.Name, Age = person.Age, Departement = Manager.Departement }

或者,如果您只对匹配的项目感兴趣B只需使用select manager .

尝试使用以下代码:

List<BType> result = B.Where(x >= A.Exists(y => y.Name == x.Name)).ToList();

这样,您只能维护人员列表中存在的经理。

您也可以使用相交。例:

public class Person
{
    public string Name { get; set; }
}
public class PersonEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Name.Equals(x.Name);
    }
    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode();
    }
}

现在您可以使用:

var persons = new List<Person>() { new Person { Name = "John" } };
var managers = new List<Person>() { new Person { Name = "John" } };
var results = persons.Intersect(managers, new PersonEqualityComparer());

如果您想比较两个不同的类,只需编辑比较器。