【问题标题】:C# LINQ Any() Comparig two ListsC# LINQ Any() 比较两个列表
【发布时间】:2021-11-04 02:25:33
【问题描述】:

我有两个列表

List<string> setA = new List<string>() {"cat", "dog", "elephant"};

List<string> setB = new List<string>() {"cat"};

我有布尔值 bool compare = setA.Any(x => x.Equals(setB.Select(y => y))); 假设为我检查来自 setA 的任何字符串是否等于来自 setB 的字符串 'cat'。它假设是“真”,但它不是:/(显示我为“假”)

我做错了什么?

【问题讨论】:

  • bool compare = setA.Any(x => setB.Any(b => x.Equals(b)));
  • 它的工作谢谢你

标签: linq


【解决方案1】:

你的方法是错误的:

bool compare = setA.Any(x => x.Equals(setB.Select(y => y)));

这会执行以下操作:检查 setA 中的任何字符串是否等于从 setB.Select(y => y) 返回的 IEnumerable<string> 实例。所以你基本上是在将一个字符串与一个永远不正确的 LINQ 查询进行比较。

这是检查 A 中的任何字符串是否在 B 中的最有效方法:

bool compare = setA.Intersect(setB).Any();

你也可以使用这个,如果列表很大,效率会降低;

bool compare = setA.Any(setB.Contains);

【讨论】:

  • 如果 setA 是典型的 classA 而 setB 是典型的 classB,其中 classA 有 classA.property1、classA.property2 和 classB 有 classB.property1 会怎样。我想比较 classA.property1 和 classB.property1 是否相等(真或假)
  • @Slide: 然后要么Select 这个属性(setA.Select(x=>x.Property1).Any(setB.Select(x=>x.Property1).Contains);) 要么实现一个自定义IEqualityComparer<classA>,这个逻辑在EqualsGetHashCode 中。您可以将该比较器用于许多 LINQ 方法。
  • 它有效。谢谢你的帮助。
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多