C#数据去重的这几种方式,你知道几种?
前言
今天我们一起来讨论一下关于C#数据去重的常见的几种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式。当然欢迎你在评论区留下你觉得更好的数据去重的方式。
使用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));
}
加入DotNetGuide技术交流群
在DotNetGuide技术交流群中可以结识更多志同道合的开发者,甚至可能与其他开发者合作完成有趣的项目。通过这个群组,我们希望能够搭建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值。
示例代码
作者名称:追逐时光者
作者简介:一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【♥推荐♥】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。