LINQ匹配集合B中集合A中的对象

时间:2016-01-25 13:29:37

标签: c# linq

我们说我们有2套

  

A = [PersonA,PersonB];

     

B = [ManagerZ,ManagerT,ManagerY];

     

结果:ManagerT,ManagerY

A中的对象与B中的对象之间存在一对一的映射。 我对B中那些在A中存在这样一个条目的对象感兴趣。

为了完整性,我们假设我们匹配名为Name

的属性

4 个答案:

答案 0 :(得分:3)

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

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匹配的项目感兴趣,请使用<{1}}。

答案 1 :(得分:3)

尝试以下

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

答案 2 :(得分:1)

尝试使用此代码:

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

通过这种方式,您只保留人员列表中存在的经理。

答案 3 :(得分:1)

您也可以使用Intersect。 例如:

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());

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