ITPub博客

首页 > 数据库 > 数据库开发技术 > C#集合数据去重的五种方式及其性能对比测试分析

C#集合数据去重的五种方式及其性能对比测试分析

原创 数据库开发技术 作者:后端Q 时间:2024-11-30 00:00:00 0 删除 编辑

👆点击关注 回复『面试』👆0元领取面试资料




在C#编程中,处理集合数据去重是一个常见的需求。为了帮助你更好地理解和选择适合的去重方法,本文将介绍五种常见的去重方式,并通过性能对比测试分析它们的优劣。

1. 使用HashSet去重

HashSet是C#中的一个集合类,它的特点是不允许重复元素。当你尝试向HashSet中添加一个重复的元素时,HashSet会忽略这个重复值,而不会引发错误。这使得HashSet成为一个非常方便的数据结构,用于存储一组唯一的元素。

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

性能特点:HashSet的性能非常好,特别是在处理大量数据时。但它不能保留原始数据的顺序。

2. 使用LINQ的Distinct()方法去重

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

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().ToList();
Console.WriteLine(string.Join(", ", uniqueData));

性能特点:Distinct()方法可以保留原始数据的顺序,但在处理大量数据时,性能可能略低于HashSet。

3. 使用GroupBy()方法去重

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

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.GroupBy(item => item).Select(group => group.First()).ToList();
Console.WriteLine(string.Join(", ", uniqueData));

性能特点:GroupBy()方法可以保留原始数据的顺序,但性能较差,特别是在处理大量数据时。

4. 使用自定义的比较器和循环遍历去重

通过自定义比较器和循环遍历,你可以实现更灵活的去重逻辑。

public class CustomEqualityComparer : IEqualityComparer<int>
{
   public bool Equals(int x, int y)
   {
       return x == y;
   }

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

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

性能特点:这种方法提供了最大的灵活性,但性能通常不如其他方法,特别是在处理大量数据时。

5. 直接循环遍历去重

最简单的方法是直接通过循环遍历来实现去重。

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))
   {
       uniqueData.Add(item);
   }
}
Console.WriteLine(string.Join(", ", uniqueData));

性能特点:这种方法简单易懂,但性能通常较差,特别是在处理大型集合时。

性能对比测试分析

为了更直观地了解这些方法的性能差异,我们可以使用BenchmarkDotNet这样的性能基准测试框架来进行测试。BenchmarkDotNet是一个基于.NET的开源框架,提供了强大的性能评估和优化能力。

通过自动化测试、多平台支持、高级统计分析和自定义配置等特性,BenchmarkDotNet可以帮助我们更好地理解和优化软件系统的性能表现。具体的测试代码和结果分析可以参考相关的性能测试文档和报告。

总结

每种去重方法都有其特点和适用场景。在选择时,你需要根据具体的需求和执行效率来做出决策。如果顺序不重要且数据量较大,推荐使用HashSet;如果需要保留原始数据的顺序且数据量较大,LINQ的Distinct()方法可能是一个不错的选择;而对于需要自定义去重逻辑的场景,自定义比较器和循环遍历则提供了更大的灵活性。









👆点击关注 回复『面试』👆0元领取面试资料


原文作者:后端Q;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    726130