C#集合根据对象的某个属性进行去重的代码示例

 更新时间:2024年03月18日 10:33:35   作者:周杰伦fans  
当根据对象的Name属性进行去重时,你可以使用以下三种方法:使用Distinct方法和自定义比较器、使用LINQ的GroupBy方法,以及使用HashSet,下面给大家介绍C#集合根据对象的某个属性进行去重的代码示例,感兴趣的朋友一起看看吧

当根据对象的Name属性进行去重时,你可以使用以下三种方法:使用Distinct方法和自定义比较器、使用LINQ的GroupBy方法,以及使用HashSet。下面是每种方法的详细代码示例和解释:

1.使用Distinct方法和自定义比较器:

using System;
using System.Collections.Generic;
using System.Linq;
// 自定义对象类
public class Person
{
    public string Name { get; set; }
}
// 自定义比较器类
public class NameEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Name == y.Name;
    }
    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode();
    }
}
public class Program
{
    public static void Main()
    {
        // 创建包含重复对象的集合
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        // 使用Distinct方法和自定义比较器进行去重
        List<Person> distinctPeople = people.Distinct(new NameEqualityComparer()).ToList();
        // 输出去重后的结果
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

解释:

  • 在上述代码中,我们首先定义了一个Person类,具有Name属性作为去重的依据。
  • 然后,我们创建了一个包含重复对象的List<Person>集合。
  • 接下来,我们定义了一个名为NameEqualityComparer的自定义比较器类,实现了IEqualityComparer<Person>接口。
  • 在自定义比较器类中,我们重写了Equals方法和GetHashCode方法,分别根据Person对象的Name属性进行比较和哈希计算。
  • 在主程序中,我们使用Distinct方法,并将自定义比较器作为参数传递给该方法,以实现根据Name属性进行去重的功能。
  • 最后,我们将去重后的结果转换为List<Person>类型,并逐个输出去重后的Person对象的Name属性。

2.使用LINQ的GroupBy方法:

using System;
using System.Collections.Generic;
using System.Linq;
// 自定义对象类
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        // 创建包含重复对象的集合
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        // 使用GroupBy方法根据Name属性进行分组,并选择每个分组的第一个对象
        List<Person> distinctPeople = people.GroupBy(p => p.Name).Select(g => g.First()).ToList();
        // 输出去重后的结果
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

解释:

  • 在上述代码中,我们定义了一个Person类,具有Name属性作为去重的依据。
  • 然后,我们创建了一个包含重复对象的List<Person>集合。
  • 接下来,我们使用GroupBy方法根据Name属性进行分组。这将返回一个IEnumerable<IGrouping<string, Person>>,其中每个分组具有一个键(Name属性的值)和相应的对象集合。
  • 然后,我们使用Select方法选择每个分组的第一个对象,以实现去重的效果。
  • 最后,我们将去重后的结果转换为List<Person>类型,并逐个输出去重后的Person对象的Name属性。

3.使用HashSet:

using System;
using System.Collections.Generic;
// 自定义对象类
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        // 创建包含重在C#中,你可以使用以下几种方法根据对象的Name属性对集合进行去重:
1. 使用Distinct方法和自定义比较器:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
    public string Name { get; set; }
}
public class NameEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Name == y.Name;
    }
    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode();
    }
}
public class Program
{
    public static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        List<Person> distinctPeople = people.Distinct(new NameEqualityComparer()).ToList();
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

在上面的代码中,我们定义了一个Person类,其中包含一个Name属性用于去重。然后,我们创建了一个包含重复对象的List集合。接下来,我们定义了一个NameEqualityComparer类,实现了IEqualityComparer接口,其中Equals方法用于比较Name属性是否相等,GetHashCode方法用于获取Name属性的哈希码。在主程序中,我们使用Distinct方法,并将自定义的比较器作为参数传递给Distinct方法,以实现根据Name属性进行去重的功能。最后,我们将去重后的结果转换为List类型,并遍历输出每个人物的Name属性。

4.使用LINQ的GroupBy方法:

using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        List<Person> distinctPeople = people.GroupBy(p => p.Name).Select(g => g.First()).ToList();
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

在上面的代码中,我们同样定义了一个Person类,并创建了一个包含重复对象的List集合。然后,我们使用GroupBy方法根据Name属性进行分组,将相同Name属性的对象放入同一个组中。接着,我们使用Select方法选择每个组中的第一个对象,以实现去重的效果。最后,我们将去重后的结果转换为List类型,并遍历输出每个人物的Name属性。

5.使用HashSet:

using System;
using System.Collections.Generic;
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        HashSet<Person> distinctPeople = new HashSet<Person>(people, new NameEqualityComparer());
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

在上面的代码中,我们同样定义了一个Person类,并创建了一个包含重复对象的List集合。然后,我们使用HashSet类,并将List集合和自定义的比较器传递给HashSet的构造函数,以实现根据Name属性进行去重的功能。最后,我们遍历输出去重后的结果。

到此这篇关于C#集合根据对象的某个属性进行去重的文章就介绍到这了,更多相关C#根据对象的某个属性去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#并发编程入门教程之概述

    C#并发编程入门教程之概述

    这篇文章主要给大家介绍了关于C#并发编程之概述的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • C# wpf 通过HwndHost渲染视频的实现方法

    C# wpf 通过HwndHost渲染视频的实现方法

    日常开发中,特别是音视频开发,需要在界面上渲染视频,比如制作一个播放器、或者视频编辑工具、以及视频会议客户端。通常拿到的是像素格式数据,此时需要渲染到wpf窗口上就需要一定的方法,本文介绍一种通过hwnd渲染的方法,控件既能提供hwnd又能嵌入wpf窗口里
    2021-11-11
  • C# 计算标准偏差相当于Excel中的STDEV函数实例

    C# 计算标准偏差相当于Excel中的STDEV函数实例

    下面小编就为大家带来一篇C# 计算标准偏差相当于Excel中的STDEV函数实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • c#入门之分支语句使用方法(三元运算符、if语句、switch语句)

    c#入门之分支语句使用方法(三元运算符、if语句、switch语句)

    这篇文章主要介绍了c#入门之分支语句使用方法,包括三元运算符、if语句、switch语句,需要的朋友可以参考下
    2014-04-04
  • C#正则表达式(Regex类)用法实例总结

    C#正则表达式(Regex类)用法实例总结

    正则表达式的主要作用是验证字符串的值是否满足一定的规则,在页面输入数据验证方面的应用比较多,下面这篇文章主要给大家介绍了关于C#正则表达式(Regex类)用法的相关资料,需要的朋友可以参考下
    2022-08-08
  • C#如何修改项目名图文详解

    C#如何修改项目名图文详解

    最近开发工作接近尾声,客户来要求更换项目的名称,差不多要变更整个解决方案中项目名称,引用等等,这个工作量还是很大的,这篇文章主要给大家介绍了关于C#如何修改项目名的相关资料,需要的朋友可以参考下
    2023-01-01
  • DataGridView冻结列或行、列顺序调整、操作行头列头标题的方法

    DataGridView冻结列或行、列顺序调整、操作行头列头标题的方法

    这篇文章介绍了DataGridView冻结列或行、列顺序调整、操作行头列头标题的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • 实例代码讲解c# 线程(下)

    实例代码讲解c# 线程(下)

    这篇文章主要介绍了c# 线程的的相关资料,文中示例代码非常细致,对大家的学习有很大帮助,感兴趣的朋友可以了解下
    2020-06-06
  • C# 抓图服务的实现

    C# 抓图服务的实现

    这篇文章主要介绍了C# 抓图服务的实现,帮助大家更好的利用c#处理窗口,进行截图,感兴趣的朋友可以了解下
    2021-01-01
  • WPF实现多运算符表达式计算器

    WPF实现多运算符表达式计算器

    这篇文章主要为大家详细介绍了WPF实现多运算符表达式计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论