使用委托作为 LINQ 的 Distinct() 的相等比较器

2023-12-31

我有一个 LINQ Distinct() 语句,它使用我自己的自定义比较器,如下所示:

class MyComparer<T> : IEqualityComparer<T> where T : MyType
{
    public bool Equals(T x, T y)
    {
        return x.Id.Equals(y.Id);
    }

    public int GetHashCode(T obj)
    {
        return obj.Id.GetHashCode();
    }
}

...

var distincts = bundle.GetAllThings.Distinct(new MyComparer<MySubType>());

这一切都很好,而且按照我想要的方式工作。出于好奇,我是否需要定义自己的比较器,或者我可以用委托替换它吗?我想我应该能够做这样的事情:

var distincts = bundle.GetAllThings.Distinct((a,b) => a.Id == b.Id);

但这不能编译。有什么巧妙的技巧吗?


Distinct 将 IEqualityComparer 作为第二个参数,因此您将需要一个 IEqualityComparer。不过,制作一个需要委托的通用模型并不太难。当然,这可能已经在某些地方实现了,例如其他答案之一中建议的 MoreLINQ。

你可以像这样实现它:

public static class Compare
{
    public static IEnumerable<T> DistinctBy<T, TIdentity>(this IEnumerable<T> source, Func<T, TIdentity> identitySelector)
    {
        return source.Distinct(Compare.By(identitySelector));
    }

    public static IEqualityComparer<TSource> By<TSource, TIdentity>(Func<TSource, TIdentity> identitySelector)
    {
        return new DelegateComparer<TSource, TIdentity>(identitySelector);
    }

    private class DelegateComparer<T, TIdentity> : IEqualityComparer<T>
    {
        private readonly Func<T, TIdentity> identitySelector;

        public DelegateComparer(Func<T, TIdentity> identitySelector)
        {
            this.identitySelector = identitySelector;
        }

        public bool Equals(T x, T y)
        {
            return Equals(identitySelector(x), identitySelector(y));
        }

        public int GetHashCode(T obj)
        {
            return identitySelector(obj).GetHashCode();
        }
    }
}

这给你语法:

source.DistinctBy(a => a.Id);

或者,如果你觉得这样更清楚:

source.Distinct(Compare.By(a => a.Id));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用委托作为 LINQ 的 Distinct() 的相等比较器 的相关文章

随机推荐

  • 编辑 D3 Sunburst 可视化的innerRadius

    如何更改旭日可视化最内圆的半径 请参阅以下示例 http bl ocks org d 910126 http bl ocks org d 910126 注意中心区域有多大 可以再小一点吗 另外 是否可以为旭日中的所有层定义不同的高度 Yes
  • 无法从 Web.Config 读取 appSettings 值

    我的 web config 中有以下内容
  • C# 中附加到鼠标的工具提示

    如何使用 C 获取附加到鼠标光标的工具提示 我试图实现如下所示的效果 一个小工具提示显示 Ctrl Shift Alt 键的状态 我目前正在使用Tooltip但除非有大约 2 行文本 否则它拒绝显示 tt new ToolTip tt Au
  • 如何解决加载模型以获得新预测的问题?

    我训练了一个模型并将其另存为import os model save 我想使用我的模型对新测试集进行预测 因此我通过以下方式加载它model tf keras models load model 它向我展示了这种警告 警告 tensorfl
  • C# 的 HttpListener 问题

    我使用一个 Windows 服务编写了HttpListener异步处理来自点的请求 它工作正常 但有时会遇到问题 需要重新启动服务或服务器才能修复 最初我声明了侦听器对象 public HttpListener PointsListener
  • 从 Moq 调用操作

    我有一个服务 其方法需要两个Actions 一为成功 一为失败 每个Action采用包含附加信息的 Result 参数 void AuthoriseUser AuthDetails loginDetails Action
  • Android 中的 Firebase 本地数据库有多安全?

    我计划改用 Firebase 作为我的 Android 应用程序的本地和在线数据库 根据文档 Firebase 首先将更改存储到本地数据库 然后在网络可用时将其推送到在线数据库 在我的应用程序中 我会将一些有关用户的非常敏感的数据放入数据库
  • TypeScript 接口是否应该在 *.d.ts 文件中定义

    TypeScript 新手问题 在我们的项目中 我们使用一些外部 JavaScript 库 需要在其中添加 d ts 文件 我了解这个用例以及我们需要这样做的原因 但是 对于我们自己定义的接口 我的一位开发人员建议我们在 d ts 文件中定
  • 如何使用 gmock MOCK_METHOD 进行重载运算符?

    我是 googlemock 和 StackOverflow 的新手 我在使用时遇到问题MOCK METHODn在googlemock中 我相信这个功能被广泛使用 这就是我所做的 我有一个抽象类Foo虚拟重载operator class Fo
  • 无法在 Azure DevOps 构建管道中使用 .NET SDK 代理

    我有一个 ASP NET Core 2 1 并添加了 Microsoft WindowsAzure Storage 的 nuget 包 但是将代码推送到存储库后 构建管道在运行构建代理时发生包错误 是否有必要在构建中添加任何其他代理除 BU
  • 将 ImageView 设置为 Android 后台

    我发现了许多类似的问题和答案 但我没有成功地解决这些问题 我想将 ImageView 设置为背景 以便我所做的其他所有事情都在它前面 我不想使用 xml 背景选项 因为我将在活动中更改我的背景 并且我不知道如何防止它拉伸 Thanks bg
  • Laravel 5 + Eloquent toJson/toArray 导致奇怪的分段错误

    我讨厌回答我自己的问题 所以也许你可以帮助我找到解决这个问题的方法 我有一些属于彼此的雄辩模型 我通过像这样的关联来设置它们 这都是正常的事情 不幸的是 这个过程会导致 device 工作不稳定 下面您可以看到单个值是可以访问的 但任何形式
  • void_t“可以实现概念”?

    我在看第二部分 期间他讨论了他的小说的用途void t lt gt 建造 在他的演讲中 Peter Sommerlad 问了他一个我不太明白的问题 链接直接指向问题 所讨论的代码就发生在该问题之前 萨默拉德问道 沃尔特 这是否意味着我们现在
  • 向 numpy 数组中的所有奇数或偶数索引元素添加一个数字,无需循环

    假设你的 numpy 数组是 A 1 1 2 3 4 您可以简单地执行以下操作 A 1 向 numpy 数组的每个元素添加一个数字 我正在寻找一种将数字添加到奇数或偶数索引数字的方法A 2 1同时保持整个阵列完好无损 是否可以在没有任何循环
  • 使用 IntelliJ IDEA 运行 Maven 项目

    我是 IntelliJ IDEA 的新手 我想使用它运行一个简单的 Maven 快速入门项目 我按照所有说明进行操作 该项目已成功构建 但是当我尝试编译并运行它时 Run按钮未激活 看来 IntelliJ IDEA 无法弄清楚主类在哪里 这
  • CGDataProviderCopyData() 实际上复制字节吗?或者只是指针?

    我正在尽可能快地连续运行该方法 并且越快越好 所以显然如果CGDataProviderCopyData 实际上是逐字节复制数据 那么我认为必须有一种更快的方法来直接访问该数据 它只是内存中的字节 任何人都知道如果CGDataProvider
  • 2D 弹性球碰撞物理

    我正在制作一个涉及弹性球物理学的程序 我已经计算出了与墙壁和静止物体碰撞的所有数学公式 但我无法弄清楚当两个移动的球碰撞时会发生什么 我有质量和速度 确切地说是 x 和 y 速度 但每个球的速度及其方向都可以 并且想要这些的公式 请记住 这
  • 为什么自动向下转换不应用于模板函数?

    有人问这个问题 https stackoverflow com questions 45505477关于字符串附加 它是string s s s 2 不编译 人们给出的答案是operator 被定义为模板函数 而operator 不是 所以
  • 更改 Azure AD B2C 注销 URL(将 AzureADB2C/Account/SignedOut 更改为自定义 URL)

    我目前正在构建一个 C Net Core 2 2 应用程序 该应用程序使用 Azure B2C OIDC 进行登录 身份验证 我已经自定义了登录页面 并且知道如何使用自定义页面布局使用我的网站上托管的 CSS 和代码来自定义编辑 忘记密码屏
  • 使用委托作为 LINQ 的 Distinct() 的相等比较器

    我有一个 LINQ Distinct 语句 它使用我自己的自定义比较器 如下所示 class MyComparer