为何Linq的Distinct实在是不给力

首先,我们需要了解什么是 Linq 中的 Distinct 方法。该方法用于从序列中提取不同的元素,即去除重复项。但是,我们在使用 Distinct 方法时需要注意以下几点:

1. Distinct 方法需要实现 IEquatable 接口

默认情况下,Distinct 方法会使用对象的 Equals 方法来判断两个对象是否相同。如果使用的对象没有实现 IEquatable 接口或重写 Equals 方法,那么 Distinct 方法的去重功能将会失效。

例如,以下代码中的 Person 类并没有重写 Equals 方法或实现 IEquatable 接口,因此 Distinct 方法不能正确地去除重复项:

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var persons = new List<Person>
{
    new Person { Id = 1, Name = "Tom" },
    new Person { Id = 2, Name = "Jerry" },
    new Person { Id = 1, Name = "Tom" }  // 重复项
};

var result = persons.Distinct().ToList();

// result 中包含重复项

为了正确使用 Distinct 方法,我们需要在对象中实现 IEquatable 接口或重写 Equals 方法。例如,以下代码重写了 Person 类的 Equals 方法,使 Distinct 方法可以正确地去除重复项:

class Person : IEquatable<Person>
{
    public int Id { get; set; }
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        if (other == null) return false;
        return this.Id == other.Id && this.Name == other.Name;
    }

    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        var person = obj as Person;
        if (person == null) return false;
        else return Equals(person);
    }

    public override int GetHashCode()
    {
        return this.Id.GetHashCode() ^ this.Name.GetHashCode();
    }
}

var persons = new List<Person>
{
    new Person { Id = 1, Name = "Tom" },
    new Person { Id = 2, Name = "Jerry" },
    new Person { Id = 1, Name = "Tom" }  // 重复项
};

var result = persons.Distinct().ToList();

// result 中不包含重复项

在以上代码中,我们重写了 Equals 方法和 GetHashCode 方法来判断两个 Person 对象是否相同。

2. Distinct 方法不支持自定义比较器

除了使用对象的 Equals 方法进行比较之外,Distinct 方法本身并不支持自定义比较器。例如,如果我们想按照 Person 对象的 Name 属性进行比较,我们需要使用 Linq 中的 GroupBy 方法:

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var persons = new List<Person>
{
    new Person { Id = 1, Name = "Tom" },
    new Person { Id = 2, Name = "Jerry" },
    new Person { Id = 3, Name = "Tom" },
    new Person { Id = 4, Name = "Jerry" }  // 重复项
};

var result = persons
    .GroupBy(p => p.Name)
    .Select(g => g.First())
    .ToList();

// result 中不包含重复项

以上代码中,我们使用 GroupBy 方法按照 Name 属性进行分组,再使用 Select 方法获取每组的第一个元素,实现了与 Distinct 方法相同的功能。

综上所述,虽然 Linq 中的 Distinct 方法在去除重复项时非常便利,但在实际使用中需要注意它的限制,以确保结果与预期一致。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:为何Linq的Distinct实在是不给力 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 微信公众平台开发之自定义菜单.Net代码解析

    微信公众平台开发之自定义菜单.Net代码解析 本文将详细讲解在.Net平台下,如何进行微信公众平台的自定义菜单开发,并附带两个样例说明。 前置要求 一台拥有.NET平台开发环境的计算机 已经完成微信公众号认证并获取了公众号的基本信息(如AppID、AppSecret) 至少掌握基本的微信公众平台接口调用方式 开发思路 获取Access Token 使用Acc…

    C# 2023年5月31日
    00
  • C#中的三种定时计时器Timer用法介绍

    下面我将为你详细讲解C#中的三种定时计时器Timer用法介绍的完整攻略。 1. 定时器Timer是什么? 定时器是一种常见的应用场景,比如日常使用的Android/IOS系统中的闹钟提醒功能、计数器功能等都需要定时器的支持。而在C#中,我们也可以使用定时器来实现某些需要定时执行的任务。 2. C#中的三种定时计时器Timer用法介绍 C#中,提供了三种常见的…

    C# 2023年6月1日
    00
  • C#如何调用MFC 窗口 DLL

    调用 MFC 窗口 DLL 是一个比较常见的需求,我们可以通过以下步骤实现: 1. 创建 MFC 窗口 DLL 项目 创建一个 MFC DLL 项目,并将其设置为创建 MFC 静态链接库。在项目中添加一个 MFC 窗口类,这将为我们提供一个调用的窗口。 2. 导出并编译 DLL 在窗口类头文件中声明一个新的公共函数,并在类源文件中将其实现。这样就可以在其他应…

    C# 2023年5月14日
    00
  • C#使用LINQ查询操作符实例代码(一)

    “C#使用LINQ查询操作符实例代码(一)”是一篇介绍C#中使用LINQ查询操作符的教程,该教程共包含以下几个部分: 简介 常见的查询操作符 LINQ查询操作符实例代码 下面分别对这几个部分进行详细讲解。 简介 该部分简单介绍了LINQ的定义和作用,以及本篇教程的目的和使用前提。重点在于说明了本教程需要读者具备一定的C#基础知识和对LINQ技术的了解。 常见…

    C# 2023年5月31日
    00
  • C#利用子线程刷新主线程分享教程

    利用子线程刷新主线程是很常见的操作。我将给出一个完整的攻略,以帮助你更好地理解这个过程。 什么是子线程和主线程? 在深入讲解利用子线程刷新主线程前,我们需要先理解子线程和主线程。在计算机中,一个进程可以分为多个线程,每个线程都有独立的执行流程。我们常说的“子线程”是指在主线程之外的线程,而“主线程”则是指操作系统为程序创建的第一个线程。 在图形用户界面(GU…

    C# 2023年6月1日
    00
  • .NET Core剪裁器背后的技术及工作原理介绍

    .NET Core剪裁器背后的技术及工作原理介绍 什么是.NET Core剪裁器? .NET Core剪裁器是一个用于减小应用程序大小的工具。它从.NET Core运行库和应用程序生产的DLL文件中,移除未使用的程序代码和库,以减小最终应用程序的大小。通过使用.NET Core剪裁器,可以显著减少应用程序的磁盘空间占用和部署时间,并提高应用程序的执行速度。 …

    C# 2023年6月3日
    00
  • Unity实现背景图片淡入淡出效果

    当我们需要为我们的Unity场景添加背景图,并且想要实现淡入淡出效果时,我们可以采用以下步骤: 第一步:导入背景图片 在我们的Unity场景目录中,我们需要准备好我们想要添加为背景图的图片素材。这些图片素材可以在资源管理器中直接从我们的系统文件夹拖拽到Unity场景目录中。 第二步:创建背景对象和材质 接下来,我们需要为背景图准备一个独立的游戏对象,并给该对…

    C# 2023年6月3日
    00
  • C#实现QQ截图功能及相关问题

    C#实现QQ截图功能及相关问题 1. 前言 在Windows系统下进行QQ截图是一种很常见的操作。开发人员可以使用C#语言来实现这个功能并且将其集成到自己的应用程序中。本文将详细讲解如何使用C#来实现QQ截图功能,是一篇有关屏幕截图技术的实用性文章。 2. 实现原理 C#实现QQ截图功能的原理与其他编程语言相同:获取屏幕的图像并对其进行编辑;接着将编辑后的图…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部