【问题标题】:Linq Lambda statement to find elements from one list of complex objects that match elements from another list of complex objects [closed]Linq Lambda 语句从一个复杂对象列表中查找与另一个复杂对象列表中的元素匹配的元素 [关闭]
【发布时间】:2014-06-26 19:11:34
【问题描述】:

考虑以下几点:

对象 A 具有属性:

Name
Location

对象 B 具有属性:

Nickname
Name
Location
City
State

我有一个List<ObjectA>List<ObjectB>

我正在尝试制定一个 linq 语句,它将返回来自 List<ObjectB> 的所有对象,这些对象具有 Name 和存在于 List<ObjectA> 中的 Location 我发现的一切都是基于简单对象或相同对象列表,而不是具有相似属性的唯一对象列表。

【问题讨论】:

  • 你的问题到底是什么?
  • 了解Join 语句和相应的Join 方法。

标签: c# linq list lambda


【解决方案1】:

从概念上讲,这只是这两个表的连接。

var query = listB.GroupJoin(listA,
    b => new{ b.Name, b.Location},
    a => new{ a.Name, a.Location},
    (b,matchingAs) => b);

【讨论】:

  • @eBot 那么你必须传入一个空值。不要那样做;传入一个非空值。你永远不应该有空集合,你应该只可能有空集合。
  • 方法'System.Linq.Enumerable.GroupJoin的类型参数(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable, System.Func, System.Func, System.Func,TResult>)' 不能从用法中推断出来。尝试明确指定类型参数。
  • @eBot 那么你的属性的类型(或名称)必须不同。您需要执行您需要执行的任何转换以使它们完全等效。
  • 我解决了,我明确定义了输出和输入列表的类型,然后将对象用于匿名类型
  • @eBot 然后它会编译并且无法正常工作。你隐藏了问题而不是解决它。
【解决方案2】:
listB.Where(x => listA.Any(a => a.Name == x.Name && a.Location == x.Location));

【讨论】:

  • 您能解释一下这是如何工作的吗?
  • 这将对列表中的每个对象进行线性搜索,这将比基于散列的解决方案扩展得更差。
  • @Servy 不幸的是,我不熟悉基于散列的解决方案,你能给我指一些关于这些的文档吗?
  • @eBot 我在 5 分钟前发布了一个答案...
  • @Servy 什么将您发布的答案定义为“基于哈希”的解决方案
【解决方案3】:
List<ObjectA> listA = new List<ObjectA>();
List<ObjectB> listB = new List<ObjectB>();

List<ObjectB> commonList = listB.Where(b => listA.Any(a => b.Name == a.Name && a.Location == b.Location)).ToList();

这将为您提供 B 中在列表 A 中具有匹配名称和位置的所有对象

【讨论】:

    【解决方案4】:

    您可以加入不同类型的列表,并使用匿名类型来定义“平等”:

    var query = 
        from b in listB
        join a in listA into As
        on new {b.Name, b.Location} equals new {a.Name, a.Location}
        select b;
    

    【讨论】:

    • 如果一个对象有多个匹配项,这将产生多次;你应该使用GroupJoin 而不是Join 来解决这个问题。
    • 这是否适用于“许多”匹配项,假设 listB 中的 1 个元素将匹配列表 a 中的许多元素
    • @eBot 不,根据我之前的评论,但这是一个微不足道的改动。
    • @eBot 不,我已经颠倒了顺序并添加了一个分组以消除重复。
    • @Servy 谢谢,已修复。
    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 2019-10-26
    • 2016-05-25
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多