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

前言

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

使用HashSet去重

C# 中的 HashSet 是一种集合类型,它确保其中的元素是唯一的,不允许重复值的存在。当你尝试向 HashSet 中添加一个重复的元素时,HashSet 会忽略重复的值,而不会引发错误。这使得 HashSet 成为一个非常方便的数据结构,用于存储一组唯一的元素,并且在需要时可以高效地进行查找、插入和删除操作,注意HashSet中的元素是无序的。

        /// <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。

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

        /// <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));
        }

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

    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();
        }
    }

直接循环遍历去重

        /// <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));
        }

示例源码

https://github.com/YSGStudyHards/DotNetGuide/blob/main/DotNetGuidePractice/HelloDotNetGuide/数组相关/ArrayDeduplication.cs

相关推荐
追逐时光者14 小时前
使用Terminal.Gui构建功能强大的.NET控制台应用
【.net】·【c#】·【开源项目】·【实用工具】·【.net core】
追逐时光者2 天前
3款C#开源且实用的工具类库,工作效率提升利器!
【.net】·【c#】·【开源项目】·【实用工具】·【.net core】
追逐时光者4 天前
一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者5 天前
基于Bootstrap Blazor开源的.NET通用后台权限管理系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者6 天前
C#数据结构与算法入门教程,值得收藏学习!
【.net】·【c#】·【开源项目】·【.net core】·【逻辑算法】
追逐时光者7 天前
C#/.NET/.NET Core编程技巧练习集(学习,实践干货)
【.net】·【c#】·【.net core】·【拾遗补漏】·【编程技巧练习集】
追逐时光者8 天前
C#/.NET/.NET Core优秀项目和框架2024年6月简报
【.net】·【c#】·【开源项目】·【实用工具】·【.net core】·【每月简报】
追逐时光者10 天前
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
【.net】·【c#】·【开源项目】·【.net core】·【开源游戏】
追逐时光者11 天前
C#/.NET这些实用的技巧和知识点你都知道吗?
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者12 天前
DotNetGuide专栏C#/.NET/.NET Core充电站(让你学习不迷路)
【.net】·【c#】·【开源项目】·【.net core】·【拾遗补漏】