【问题标题】:Find items from a list which exist in another list从列表中查找存在于另一个列表中的项目
【发布时间】:2013-04-02 16:45:32
【问题描述】:

我有一个List<PropA>

PropA  
{  
    int a;  
    int b;  
}

还有一个List<PropX>

PropX  
{  
    int a;  
    int b;  
}

现在我必须使用 lambda 或 LINQ 从 List<PropA> 中找到与 b 属性匹配的 List<PropX> 中的项目。

【问题讨论】:

  • 到目前为止,您尝试了什么?这个问题已经回答了太多次了...
  • @David 也许他们每个人都有他没有显示的不同字段,或者他们有一组不同的方法,即使他们有相同的值,或者其他任何原因。
  • 知道了!我认为 a & b 都应该匹配。这是我的错。

标签: c# linq collections lambda


【解决方案1】:
ListA.Where(a => ListX.Any(x => x.b == a.b))

【讨论】:

  • 好吧,我进行了一个简单的测试,Join 的结果大大快了。 ideone.com/xW1CnL 。您需要自己运行代码才能使用更大的数据集。
  • 是的,我忘了运行查询。似乎对于足够小的数据集(少于 500 个项目),连接的实例化成本超过了性能提升。
  • 如果性能是不可能的,那么我会采用代码简单性。这将是一个主观和个人的偏好。
  • 在这种情况下,正在执行的操作基本上是一个连接。这就是这段代码的语义,所以使用那个精确的运算符而不是使用Where 来实现你自己的Join 是最有意义的。 Join 在向读者传达含义方面做得更好
【解决方案2】:

你要做的是Join这两个序列。 LINQ 有一个 Join 操作符可以做到这一点:

List<PropX> first;
List<PropA> second;

var query = from firstItem in first
    join secondItem in second
    on firstItem.b equals secondItem.b
    select firstItem;

请注意,LINQ 中的 Join 运算符也被编写为执行此操作,比在第二个集合中为每个项目执行线性搜索的简单实现要高效得多。

【讨论】:

  • 还有另外一种写法...first.Join(second, f =&gt; f.b, s =&gt; s.b, (fir, sec) =&gt; fir);
  • @MalcolmO'Hare 是的,两者完全相同。这将编译成那个。我发现大多数人更喜欢使用查询语法而不是方法语法来写出Join,甚至比其他任何查询方法都更喜欢。
  • 根据业务逻辑和输入数据的运行方式,可能需要包含 Distinct() 调用以删除连接返回的重复值。
【解决方案3】:
var commonNumbers = first.Intersect(second); 

这将为您提供两个列表之间的公共值,这是一种比连接或其他 Lambda 表达式更快、更简洁的方法。

试试吧。

来源:MSDN

【讨论】:

  • 这只有在T 是两个IEnumerable&lt;T&gt; 集合的相同类型时才有效,而问题中的情况并非如此。
  • +1,这是您根据 title 打开问题的情况之一,这是该部分的完美答案,尽管它没有回答实际问题问题的内容
  • 感谢 Simo Kivisto
【解决方案4】:

如果你有多个参数,以上所有方法都行不通,所以我认为这是最好的方法。

例如:从 pets 和 pets2 中查找不匹配的项目。

var notMatchedpets = pets
    .Where(p2 => !pets2
    .Any(p1 => p1.Name == p2.Name && p1.age == p2.age))
    .ToList();

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 2022-11-12
    • 2013-12-12
    • 2020-10-27
    • 1970-01-01
    • 2013-03-11
    • 2020-01-08
    • 2022-11-03
    相关资源
    最近更新 更多