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

假设我们有 2 套

A = [ PersonA,PersonB];

B = [ManagerZ,ManagerT,ManagerY];

结果:ManagerT,ManagerY

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

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

【问题讨论】:

  • 为了弄清楚:你想要集合B中的所有对象b,在集合A中存在对象a,这样a.Name == b.Name
  • @chris SetA.Where(el => SetA.Any(a => a.Name == el.Name)

标签: c# linq


【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2019-04-17
      • 2022-11-03
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多