完美解决c# distinct不好用的问题

以下是关于“完美解决c# distinct不好用的问题”的完整攻略:

问题描述

C# 中使用 Distinct() 方法可以去除一个集合中的重复元素,但是如果需要去除自定义类中的成员变量重复的方法时,经常会遇到以下两个问题:

  1. 需要先实现 IEqualityComparer 接口;
  2. 直接使用 Distinct() 方法对 List 自定义类对象去重会报错。

以下是解决这两个问题的完整攻略。

解决方法

方法一

实现 IEqualityComparer 接口,作为参数传递给 Distinct() 方法。

以下是示例代码:

// 自定义类的实现
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 自定义比较器
public class PersonEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x.Id == y.Id && x.Name == y.Name)
        {
            return true;
        }
        return false;
    }

    public int GetHashCode(Person obj)
    {
        return obj.Id.GetHashCode() + obj.Name.GetHashCode();
    }
}

// 示例代码
List<Person> personList = new List<Person>()
{
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=2, Name="Lucas"},
    new Person(){ Id=3, Name="Tom"},
    new Person(){ Id=3, Name="Tom"}
};

var distinctList = personList.Distinct(new PersonEqualityComparer());

方法二

重写自定义类的 Equals()GetHashCode() 方法,直接使用 Distinct() 方法去重。

以下是示例代码:

// 自定义类的实现
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    // 重写 Equals 方法比较对象是否相等
    public override bool Equals(object obj)
    {
        if (obj == null)
        {
            return false;
        }

        if (this.GetType() != obj.GetType())
        {
            return false;
        }

        Person p = (Person)obj;
        return (this.Id == p.Id) && (this.Name == p.Name);
    }

    // 重写 GetHashCode 方法获取对象的 Hash 值
    public override int GetHashCode()
    {
        return this.Id.GetHashCode() + this.Name.GetHashCode();
    }
}

// 示例代码
List<Person> personList = new List<Person>()
{
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=2, Name="Lucas"},
    new Person(){ Id=3, Name="Tom"},
    new Person(){ Id=3, Name="Tom"}
};

var distinctList = personList.Distinct();

总结

以上是两种解决在 C# 中使用 Distinct() 方法去重自定义类对象的完整攻略,可以根据具体情况选择使用哪种方法。无论是哪种方法,都可以完美解决 C# Distinct 方法不好用的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:完美解决c# distinct不好用的问题 - Python技术站

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

相关文章

  • C#学习笔记- 浅谈数组复制,排序,取段,元组

    C#学习笔记- 浅谈数组复制,排序,取段,元组 数组复制 数组浅复制 浅复制就是复制了数组的引用,并不是数组的内容。在 C# 中,可以使用 Array 类的 Clone() 方法实现数组的浅复制。 以下示例代码演示了如何使用 Clone() 方法进行浅复制: int[] array1 = { 1, 2, 3, 4, 5 }; int[] array2 = (…

    C# 2023年6月7日
    00
  • C#实现语音视频录制-附demo源码

    标题:C#实现语音视频录制-附demo源码完整攻略 简介 本攻略旨在介绍如何使用C#实现语音视频录制的方法,并提供示例代码。该方法基于NAudio和AForge库,可以在Windows系统中实现对声音和视频的录制,并支持保存为MP4格式。 步骤 下载并安装NAudio和AForge库。 在项目中引用这两个库。 添加代码: private void Start…

    C# 2023年6月6日
    00
  • 用C#破解Chrome浏览器cookie值

    背景 最近小编接到一个获取网站请求数据的需求,要求抓取网站某个页面请求的数据。我使用Google Chrome浏览器查看了一下请求链接的传入参数,发现需要传入一个Token值才能获取数据。于是我在Chrome中登录后,通过Postman请求成功,并将Token存储到了Cookie中。然而问题又来了,在代码层面如何获取这个Token呢? 解决方案 小编在网上查…

    C# 2023年4月18日
    00
  • php中分页及SqlHelper类用法实例

    下面是关于“PHP中分页及SqlHelper类用法实例”的详细解释和攻略: 1. 分页在PHP中的使用 分页是指在数据较多的情况下,将数据分为多页显示。在PHP中,我们可以使用一个函数来实现分页。这个函数是 array_slice() 函数。 array_slice() 函数可以在数组中根据指定的 offset 和 length 参数返回该数组的一个部分。我…

    C# 2023年5月31日
    00
  • ASP.NET返回上一页面的实现代码

    ASP.NET 是一种 Web 应用程序开发框架,提供很多丰富的 API,可以帮助我们轻松地开发 Web 应用程序。返回上一页面也是 ASP.NET 中非常常见的一个需求,本文将为您介绍如何实现 ASP.NET 返回上一页面的实现代码。 方法一:使用浏览器提供的返回功能 在 ASP.NET 中,我们可以使用浏览器提供的返回功能,让用户返回到上一页面。ASP.…

    C# 2023年5月31日
    00
  • C# Linq的ToList()方法 – 将序列转换为列表

    C# Linq的ToList()方法详解 ToList()方法是C#中Linq查询的扩展方法之一,它将一个序列转换成一个List集合,实现方式是创建一个包含序列中所有元素的新实例。该方法的通用使用方式如下所示: public static List<TSource> ToList<TSource>(this IEnumerable&l…

    C# 2023年4月19日
    00
  • C# PictureBox图片控件实现图片交换

    下面是“C# PictureBox图片控件实现图片交换”的完整攻略: 简介 在.NET Windows Forms应用程序中,PictureBox控件是一个常用的控件,用于显示图像并对其进行操作。其中,图片交换是一个常见的操作,本文将从以下几个方面介绍如何使用PictureBox控件实现图片交换: PictureBox控件的基本使用; 从本地文件读取图片并显…

    C# 2023年5月31日
    00
  • C#通过属性名称获取(读取)属性值的方法

    获取C#对象的属性值通常可以使用对象的属性名称来实现。在 C# 中,属性名称是一个字符串,可以在运行时利用反射机制获取对象的属性信息,并通过属性名称获取属性值。 首先,在 C# 中利用反射机制获取对象的属性信息,可以通过以下步骤来实现: 获取对象的类型信息:使用Type.GetType或typeof关键字获取对象类型信息,例如: csharp Type ty…

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