C#中Linq的去重方式Distinct详解

C#中Linq的去重方式Distinct详解

在C#中使用Linq可以方便地操作集合数据,去重是常见的操作之一,Distinct方法可以帮助我们快速实现去重。

Distinct方法的语法

使用Linq的Distinct方法可以对一个集合进行去重。其语法如下:

public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);

其中参数source表示输入的集合,返回值为一个去重后的IEnumerable<TSource>类型的序列。

Distinct方法的使用方式

Distinct方法可以应用于所有实现了IEnumerable接口的集合类型。例如:

var list = new List<int>() { 2, 5, 4, 2, 3, 1, 5, 3 };
var distinctList = list.Distinct();

上面的代码中,我们创建一个整数类型的List集合,其中包含重复的元素。调用Distinct方法获取去重后的集合,distinctList中的元素是2, 5, 4, 3, 1

Distinct方法原理

Distinct方法通过比较集合中的元素来实现去重,基本原理为:使用对元素进行哈希的方法来检测重复元素。Distinct方法通过调用元素的GetHashCode方法来检测元素的哈希码,如果两个元素的哈希码相同,则调用元素的Equals方法比较它们是否相等。

默认情况下,Distinct方法使用元素类型的默认比较器(EqualityComparer.Default)来比较元素。如果元素类型没有重载Equals方法,则默认使用Object.Equals方法来比较元素。

自定义Distinct方法的比较器

有时候默认的比较器不能满足我们的需求,我们可以自定义比较器来完成特定的比较操作。例如:我们有一个Person类,需要按照行业来进行去重:

class Person
{
    public string Name { get; set; }
    public string Industry { get; set; }
}

var people = new List<Person>() 
{
    new Person { Name = "张三", Industry = "IT" },
    new Person { Name = "李四", Industry = "IT" },
    new Person { Name = "王五", Industry = "金融" },
    new Person { Name = "赵六", Industry = "金融" },
};

var distinctPeople = people.Distinct(new PersonComparer());

上面的代码中,我们定义了一个PersonComparer类,实现了IEqualityComparer接口,重载了GetHashCode和Equals方法。然后我们调用Distinct方法并传入自定义的比较器,获得按照行业Industry去重后的集合。

下面是PersonComparer类的定义和使用:

class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Industry == y.Industry;
    }

    public int GetHashCode(Person obj)
    {
        return obj.Industry.GetHashCode();
    }
}

总结

使用Linq的Distinct方法可以快速实现集合的去重操作,可以应用于所有实现了IEnumerable接口的集合类型。如果默认的比较器不能满足需求,可以自定义比较器来实现特定的比较操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中Linq的去重方式Distinct详解 - Python技术站

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

相关文章

  • 详解JAVA调用WCF服务的示例代码

    Java和WCF都是用于构建分布式应用程序的技术。Java可以通过调用WCF服务来实现与.NET平台的通信。本文将详细讲解如何使用Java调用WCF服务的示例代码,并提供两个示例。 1. 使用Java调用WCF服务的示例代码 以下是使用Java调用WCF服务的示例代码: import java.net.URL; import javax.xml.namesp…

    C# 2023年5月15日
    00
  • asp.net 需要登陆的网站上下载网页源代码和文件

    要下载需要登陆的网站的源代码和文件,我们可以使用以下步骤: 安装浏览器扩展程序 我们可以搜索并安装一些浏览器扩展程序,如“EditThisCookie”或“Get Cookies”,这些扩展程序可以帮助我们获取网站的cookie信息,用以模拟登陆状态。 登陆并获取cookie信息 使用浏览器登陆需要下载的网站,进入登陆状态后,打开扩展程序,获取cookie信…

    C# 2023年5月31日
    00
  • 深入.net调用webservice的总结分析

    《深入.NET调用Web Service的总结分析》是一篇介绍.Net平台下调用Web服务的文章。其内容主要包括Web服务的概念介绍、使用.Net框架下的方式调用Web服务的具体步骤、调用WebService是需要注意的问题等。 概述 Web服务(Web service)是指通过Internet对外提供的可以被远程应用程序调用的程序接口。在.Net平台下可以…

    C# 2023年6月6日
    00
  • C# Winform 分页功能的实现

    下面是关于C# Winform分页功能实现的完整攻略: 1. 什么是分页功能 分页,在信息管理系统中常见的一种数据查找方式,数据量比较大的时候,把所有数据都一次性请求会导致页面响应时间过长,从而影响用户体验。因此,常规情况下需要对请求的数据进行分页处理,通过分页显示相应的数据,让用户能够更快更方便的查看信息。 2. 分页功能的实现 2.1 数据库存储分页信息…

    C# 2023年5月31日
    00
  • Unity Shader片段着色器使用基础详解

    Unity Shader片段着色器使用基础详解 Unity中的Shader(着色器)用于控制游戏对象的渲染方式,让它们变得更加美观、细致。Shader分为顶点着色器和片段着色器,这篇攻略主要介绍Unity中片段着色器的使用基础,可以帮助开发者更加细致地控制对象的渲染方式。 Shader基础知识 在进入片段着色器的详细使用说明前,我们先来了解一些Shader的…

    C# 2023年6月3日
    00
  • 基于switch你可能不知道的一些用法

    基于switch你可能不知道的一些用法 简介 switch 是 JavaScript 中流程控制语句之一,可以根据指定的表达式的值,在多个代码块中选择执行其中的一个。通常,switch 语句用于代替多个 if 语句的情况。 除了常见的使用场景外,switch 还有一些其他很有用的用法,接下来我们来学习其中几个常用的技巧。 示例一:多个条件匹配 在普通的 sw…

    C# 2023年6月3日
    00
  • 解析C#编程的通用结构和程序书写格式规范

    解析C#编程的通用结构和程序书写格式规范 通用结构 C#程序通常包括以下部分: using System; // 引用命名空间 public class MyClass // 定义类 { static void Main() // 主方法 { // 代码块 } } using语句引用需要使用的命名空间。 public class定义一个公共的类。 Main方…

    C# 2023年5月15日
    00
  • Asp.Net权限管理系统 专用代码生成工具(DDBuildTools) 1.1.0 下载

    “Asp.Net权限管理系统 专用代码生成工具(DDBuildTools) 1.1.0” 是一个辅助开发Asp.Net权限管理系统的工具,旨在提高开发效率。以下是该工具的详细使用攻略。 1. 下载和安装DDBuildTools 首先,你需要下载和安装 DDBuildTools 工具。可在以下官网地址下载:http://www.ddbuild.cn/Produ…

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