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

Posted

技术标签:

【中文标题】LINQ 匹配集合 B 中的集合 A 中的对象【英文标题】:LINQ match objects in set A in set B 【发布时间】:2016-05-01 20:04:28 【问题描述】:

假设我们有 2 套

A = [ PersonA,PersonB];

B = [ManagerZ,ManagerT,ManagerY];

结果:ManagerT,ManagerY

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

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

【问题讨论】:

看看这个***.com/questions/2767709/… 为了弄清楚:你想要集合B中的所有对象b,在集合A中存在对象a,这样a.Name == b.Name @chris SetA.Where(el => SetA.Any(a => a.Name == el.Name) 【参考方案1】:

试试这个代码:

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

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

【讨论】:

应该注意,这仅在AList&lt;Person&gt; 时有效,因为ExistsList&lt;T&gt; 的实例方法。【参考方案2】:

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

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

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

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

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

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

【讨论】:

论证我为什么不接受你的答案:我正在寻找比我接受的答案更简单的东西。这增加了很多样板代码。我假设任何一种解决方案的复杂性都是 O(N^2) 所以我总是会选择更简单的。如果我错了并且您的方法有一些优化,我很乐意接受您的回答。谢谢 如果有多个名称与人员列表匹配,这可能会导致重复的经理对象。【参考方案3】:

尝试关注

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

【讨论】:

【参考方案4】:

您也可以使用相交。 示例:

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。

【讨论】:

以上是关于LINQ 匹配集合 B 中的集合 A 中的对象的主要内容,如果未能解决你的问题,请参考以下文章

加入集合的 LINQ 更新

使用 LINQ 的对象层次结构的深度优先扁平化集合

图的最大匹配算法

linq 学习笔记

LINQ学习——JOIN

如何获取 Linq 查询结果集合中的索引?