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();
通过这种方式,您只保留人员列表中存在的经理。
【讨论】:
应该注意,这仅在A
是List<Person>
时有效,因为Exists
是List<T>
的实例方法。【参考方案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 中的对象的主要内容,如果未能解决你的问题,请参考以下文章