首页 > 数据库 > 数据库开发技术 > C#集合数据去重的五种方式及其性能对比测试分析
👆点击关注 回复『面试』👆0元领取面试资料
在C#编程中,处理集合数据去重是一个常见的需求。为了帮助你更好地理解和选择适合的去重方法,本文将介绍五种常见的去重方式,并通过性能对比测试分析它们的优劣。
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的性能非常好,特别是在处理大量数据时。但它不能保留原始数据的顺序。
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。
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()方法可以保留原始数据的顺序,但性能较差,特别是在处理大量数据时。
通过自定义比较器和循环遍历,你可以实现更灵活的去重逻辑。
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));
性能特点:这种方法提供了最大的灵活性,但性能通常不如其他方法,特别是在处理大量数据时。
最简单的方法是直接通过循环遍历来实现去重。
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;如有侵权,请联系管理员删除。