前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#数据去重的这几种方式,你知道几种?

C#数据去重的这几种方式,你知道几种?

原创
作者头像
追逐时光者
发布2023-08-14 21:00:00
2260
发布2023-08-14 21:00:00
举报
文章被收录于专栏:编程进阶实战编程进阶实战

前言

今天我们一起来讨论一下关于C#数据去重的常见的几种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式。当然欢迎你在评论区留下你觉得更好的数据去重的方式。

使用HashSet去重

HashSet的唯一性:

HashSet 中的元素是唯一的,不允许重复值。如果试图添加重复的元素,HashSet 不会引发错误,而是简单地忽略重复的值。

代码语言:javascript
复制
????????///?<summary>
????????///?使用HashSet去重
????????///?TODO:HashSet是一个集合类,它的特点是不允许重复元素,可以方便地实现去重功能。
????????///?</summary>
????????public?static?void?HashSetDuplicate()
????????{
????????????var?dataSource?=?new?List<int>()?{?1,?2,?3,?2,?5,?88,?99,?99,?100,?88,?30,?50,?15,?100,?99,?99,?2,?3?};
????????????HashSet<int>?uniqueData?=?new?HashSet<int>(dataSource);

????????????Console.WriteLine(string.Join(",?",?uniqueData));
????????}

使用Linq的Distinct()方法去重

Linq中的Distinct()方法用于从集合中筛选出不重复的元素。Distinct()方法基于元素的相等性来进行筛选,并返回一个包含不重复元素的新序列。底层实现还是使用到了HashSet。

代码语言:javascript
复制
????????///?<summary>
????????///?使用Linq的Distinct()方法去重
????????///?</summary>
????????public?static?void?DistinctDuplicate()
????????{
????????????var?dataSource?=?new?List<int>()?{?1,?2,?3,?2,?5,?88,?99,?99,?100,?88,?30,?50,?15,?100,?99,?99,?2,?3?};
????????????var?uniqueData?=?dataSource.Distinct();

????????????Console.WriteLine(string.Join(",?",?uniqueData));
????????}

使用Linq的GroupBy()方法去重

GroupBy()方法将原始集合中的元素进行分组,根据指定的键或条件进行分组。每个分组都会有一个唯一的键,通过将原始集合分组并选择每个分组中的第一个元素,实现了去重的效果。

代码语言:javascript
复制
????????///?<summary>
????????///?使用Linq的GroupBy()方法去重
????????///?</summary>
????????public?static?void?GroupByDuplicate()
????????{
????????????var?dataSource?=?new?List<int>()?{?1,?2,?3,?2,?5,?88,?99,?99,?100,?88,?30,?50,?15,?100,?99,?99,?2,?3?};

????????????//GroupBy()方法将原始集合中的元素进行分组,根据指定的键或条件进行分组。每个分组都会有一个唯一的键,通过将原始集合分组并选择每个分组中的第一个元素,实现了去重的效果。
????????????var?uniqueData?=?dataSource.GroupBy(item?=>?item).Select(group?=>?group.First()).ToList();

????????????Console.WriteLine(string.Join(",?",?uniqueData));
????????}

使用自定义的比较器和循环遍历

代码语言:javascript
复制
????public?class?ArrayDeduplication
????{
????????///?<summary>
????????///?使用自定义的比较器和循环遍历
????????///?</summary>
????????public?static?void?CustomEqualityComparerDuplicate()
????????{
????????????var?dataSource?=?new?List<int>()?{?1,?2,?3,?2,?5,?88,?99,?99,?100,?88,?30,?50,?15,?100,?99,?99,?2,?3?};
????????????var?uniqueData?=?new?List<int>();
????????????foreach?(var?item?in?dataSource)
????????????{
????????????????if?(!uniqueData.Contains(item,?new?CustomEqualityComparer()))
????????????????{
????????????????????uniqueData.Add(item);
????????????????}
????????????}
????????????Console.WriteLine(string.Join(",?",?uniqueData));
????????}
????}
????????
????///?<summary>
????///?自定义的比较器
????///?</summary>
????public?class?CustomEqualityComparer?:?IEqualityComparer<int>
????{
????????public?bool?Equals(int?x,?int?y)
????????{
????????????return?x?==?y;
????????}

????????public?int?GetHashCode(int?obj)
????????{
????????????return?obj.GetHashCode();
????????}
????}

直接循环遍历去重

代码语言:javascript
复制
????????///?<summary>
????????///?直接循环遍历去重
????????///?</summary>
????????public?static?void?LoopTraversalDuplicate()
????????{
????????????var?dataSource?=?new?List<int>()?{?1,?2,?3,?2,?5,?88,?99,?99,?100,?88,?30,?50,?15,?100,?99,?99,?2,?3?};
????????????var?uniqueData?=?new?List<int>();
????????????foreach?(var?item?in?dataSource)
????????????{
????????????????//if?(!uniqueData.Any(x?=>?x?==?item))
????????????????//if?(!uniqueData.Exists(x?=>?x?==?item))
????????????????if?(!uniqueData.Contains(item))
????????????????{
????????????????????uniqueData.Add(item);
????????????????}
????????????}
????????????Console.WriteLine(string.Join(",?",?uniqueData));
????????}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 使用HashSet去重
    • HashSet的唯一性:
    • 使用Linq的Distinct()方法去重
    • 使用Linq的GroupBy()方法去重
    • 使用自定义的比较器和循环遍历
    • 直接循环遍历去重
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com