【问题标题】:Linq query between two list objects两个列表对象之间的 Linq 查询
【发布时间】:2012-01-26 16:37:38
【问题描述】:

我有两个对象:

ObjectA
{
   string code;
   string country;
}

ObjectB
{
   string code;
   string otherstuff;
}

我有List<objectA>List<ObjectB>,我需要找到List<ObjectB> 中包含objectA.Code 的所有对象。 但无法在 LINQ 查询上实现它。

【问题讨论】:

  • 1.您是否有单个 objectA 或者您需要来自 List<objectA> 的所有对象。 2. 你期望的结果是怎样的布局? 3. 到目前为止你尝试过什么?
  • 看看 IEnumerable.Intersect: msdn.microsoft.com/en-us/library/bb460136.aspx 你需要同时覆盖 EqualsGetHashCode 并允许通过 Code 相互比较。

标签: c# linq


【解决方案1】:

听起来您正在尝试查找 ObjectB 的所有实例,这些实例在任何 List<ObjectA> 值中都存在 code 值。如果是这样,请尝试以下操作

List<ObjectA> listA = ...;
List<ObjectB> listB = ...;
var all = listB.Where(b => listA.Any(a => a.code == b.code));

【讨论】:

    【解决方案2】:

    听起来您想在 code 属性上加入 ObjectA 列表和 ObjectB 列表。这是一种方式:

    List<ObjectA> listOfA = ...;
    List<ObjectB> listOfB = ...;
    var all = from a in listOfA
              join b in listOfB on a.code equals b.code
              select new {a,b};
    

    结果是一个匿名对象列表,包含 2 个属性:a 类型为 ObjectA,b 类型为 ObjectB,具有相同的code

    【讨论】:

      【解决方案3】:

      要有效地做到这一点,您可以首先将代码放入HashSet&lt;string&gt;,然后使用Contains() 查询来检查有问题的 B 是否具有包含在哈希集中的代码:

      var codes = new HashSet<string>(listOfAs.Select(x => x.code));
      var selectedBs = listOfBs.Where( x=> codes.Contains(x.code));
      

      【讨论】:

        【解决方案4】:

        我会将ObjectA 列表的代码放入HashSet,否则您的查询将变成O(n2) 操作。像这样,它是一个 O(n) 操作:

        var aList = new List<ObjectA>();
        var bList = new List<ObjectB>();
        
        var aCodes = new HashSet<string>(aList.Select(a => a.code));
        var result = bList.Where(b => aCodes.Contains(b.code));
        

        【讨论】:

        • 谢谢奥利维尔。您是否知道 linq 中的任何不错的教程或带有速度等示例的书籍?
        • 对于 LINQ 谷歌LINQ tutorial C#。至于速度,这里相关的是对不同集合类型及其优缺点有基本的了解。 James Michael Hare 在这里给出了一个很好的概述:Choosing the Right Collection Class
        猜你喜欢
        • 2016-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 2019-06-14
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多