【问题标题】:List.Except except with property of custom class [duplicate]List.Except 自定义类的属性除外[重复]
【发布时间】:2019-03-15 16:37:23
【问题描述】:

所以我试图让它尽可能简单,但坚持要找到我的两个列表之间的区别,这两个列表都包含一个名为“元素”的类。 每个“元素”都有 3 个属性 - 路径、名称、大小。现在我想将 ListA 与 ListB 进行比较,如果 ListA 有一个具有 ListB 没有的属性 Name 的元素。

我已经试过了:

List<Element> diffList = from first in ListA
    join second in ListB
    on first.Name equals second.Name
    select first;

这很奇怪,因为 ListA 的最大计数约为 60.000,而 diffList 的计数为 2200 万。 我也试过了:

List<Element> diffList = ListA
    .Where(w => !ListB.Contains(w.Name))
    .ToList();

这甚至无法编译。

提前致谢。

【问题讨论】:

  • MoreLinq 的ExceptBy.
  • "列表都包含一个名为“元素”的类。每个“元素”有 3 个属性 - 路径、名称、大小。" “...如果 ListA 有一个具有 ListB 没有的属性 Name 的元素。”这不是矛盾吗?
  • @mjwills 我该如何使用它?我已经添加了 NuGet 包。会像“diffList = ListA.MoreLinq.SequenceException...”还是怎么样?
  • 使用需要EqualityComparerExcept 重载,您可以在其中比较Element 类的Name 属性:docs.microsoft.com/en-us/dotnet/api/…
  • @Grimm 可能我无法解释清楚自己,我不是以英语为母语的人。我将尝试使用备份示例,假设 ListA 是从源目录填充的,而 ListB 是由目标填充的。因此,如果 ListA 有一个新文件,它将比 ListB 大,在这种情况下,我想知道 ListB 中哪个“元素”不同或缺失,希望这是可以理解的。

标签: c# list linq


【解决方案1】:

你想要Any(),或者All(),而不是Contains()

var diff= ListA.Where(e1 => !ListB.Any(e2=> e2.Name.Equals(e1.Name))).ToList();
// or better
var diff= ListA.Select(e => e.Name).Except(ListB.Select(e => e.Name)).ToList();

这可能不是非常大的集合的最佳方式,如果可以避免,请将集合保留为 IEnumerables,直到需要投影结果。

【讨论】:

  • 这个问题是,在我的情况下,差异也是一个 List,我需要通过属性名称获取元素。在您的代码中,我会将名称作为字符串而不是整个元素,其中名称属性不存在于 ListB 但在 ListA 中。
  • @Chookees 我明白了。在这种情况下,第一个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2015-08-05
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多