基于某些属性的 2 个集合的 C# 交集

Posted

技术标签:

【中文标题】基于某些属性的 2 个集合的 C# 交集【英文标题】:C# Intersection of 2 collections based on certain properties 【发布时间】:2014-11-12 01:12:40 【问题描述】:

我有一个WebItem 对象定义为

public class WebItem

    public string Title;
    public string Url;
    public string RandomProperty1;
    public string RandomProperty2;
    public string RandomProperty3;

我有两个Lists 的WebItem 对象,我正在尝试找出List 1 中是否有List 2 中的对象。但问题是,如果至少 TitleUrl 相同,我会认为它匹配。我不太关心其他属性的值是什么。

例子:

List 1
   1: Title="Dog", Url="/dog.aspx", RandomProperty1="Yorkshire"
   2: Title="Cat", Url="/cat.aspx", RandomProperty1="Persian", RandomProperty2="Grey"
   3: Title="Rat", Url="/rat.aspx"

List 2
   1: Title="Dog", Url="/dog.aspx", RandomProperty1="Pitbull"
   2: Title="Cat", Url="/kitten.aspx", RandomProperty1="Persian", RandomProperty2="Grey"
   3: Title="Bird", Url="/bird.aspx", RandomProperty1="Parrot"

在这种情况下,唯一的“匹配”将是“狗”,因为 TitleUrl 相同。

我将如何在 Linq 中执行此操作?我考虑过使用.Intersect,但我不确定有关属性的条件。

【问题讨论】:

【参考方案1】:

您可以提供自己的 GetHashCodeEquals 覆盖,如果您确实打算在所有情况下,如果两个属性相等,则两个项目相等。如果不是这种情况,并且您只希望平等以这种方式工作以实现这一操作,请使用 linq Intersect 但使用 different overload 并提供您自己的 IEqualityComparer<T>

【讨论】:

哦,没有意识到Intersect 可以承受过载。谢谢!【参考方案2】:

只需为您的类实现 IEqualityComparer<T>(例如 GetHashcode 和 Equals),然后使用 Intersect。

实现 Equals 方法的一个例子是:

public bool Equals(WebItem x, WebItem y)

    return x.Title == y.Title && x.Url == y.Url;

【讨论】:

以上是关于基于某些属性的 2 个集合的 C# 交集的主要内容,如果未能解决你的问题,请参考以下文章

C# 取两个集合的交集并集差集

c# 两个list的交集问题!

Java List 集合取 交集并集差集补集 Java集合取交集Java集合并集

Linq 交集并集等集合理论学习

[Python]集合的交集,并集,差集

2017-6-2 Linq 高级查询 (分页和组合查)集合取交集