C#:查找数组中的重复元素

215 篇文章 ¥59.90 ¥99.00
本文介绍了一种C#中查找数组重复元素的简单高效方法,通过使用Dictionary记录元素出现次数,遍历找出计数大于1的元素,时间复杂度为O(n)。代码示例展示了如何实现并输出重复元素列表。

在C#编程中,经常会遇到需要查找数组中是否存在重复元素的情况。本文将介绍一种简单的方法来实现这个功能,同时提供相应的源代码。

using System;
using System.Collections.Generic;

class Program
{
   
   
    static void Main
### 使用 `HashSet<T>` 删除数组中的重复元素C# 中,可以利用 `HashSet<T>` 数据结构来快速移除数组中的重复项。`HashSet<T>` 是一种集合类型,专门设计用来存储唯一值。当向 `HashSet<T>` 添加新元素时,如果该元素已经存在于集合中,则不会再次插入[^1]。 下面是基于 `HashSet<T>` 实现的一个简单例子: ```csharp using System; using System.Collections.Generic; namespace RemoveDuplicates { public class Program { public static void Main(string[] args) { int[] numbers = { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9 }; // 创建 HashSet 并填充原始数组的值 HashSet<int> uniqueNumbers = new HashSet<int>(numbers); Console.WriteLine("去除重复数字后的数组:"); foreach (int number in uniqueNumbers) { Console.WriteLine(number); } } } } ``` 这种方法的优点在于时间效率高,因为 `HashSet<T>` 的查找和插入操作平均复杂度为 O(1)。 --- ### 使用 `List<T>` 结合手动去重逻辑 另一种常见方式是使用 `List<T>` 配合条件判断实现去重功能。这种方式适合于需要更多控制权的情形下使用[^2]。 以下是具体实现代码片段: ```csharp using System; using System.Collections.Generic; namespace RemoveDuplicatesManually { public class Program { public static void Main(string[] args) { int[] array = { 1, 1, 1, 2, 2, 3 }; List<int> arrayList = new List<int>(); foreach (int n in array) { if (!arrayList.Contains(n)) { arrayList.Add(n); } } Console.WriteLine("去除重复数字后的数组:"); foreach (int n in arrayList) { Console.Write(n + " "); } } } } ``` 虽然这种做法直观易懂,但由于每次都需要调用 `Contains` 方法检查是否存在相同元素,因此整体性能会受到一定影响,特别是针对较大的输入数据集时[^2]。 --- ### 数组排序后去重法 还有一种经典算法是对数组先行排序再执行相邻比较从而达到剔除冗余的目的[^4]。此方法特别适用于那些允许改变原有顺序的应用场景之中。 示例如下所示: ```csharp using System; using System.Collections.Generic; using System.Linq; namespace SortAndRemoveDuplicates { public class Program { public static void Main(string[] args) { int[] array = { 2, 4, 6, 2, 8, 5, 8, 10 }; Array.Sort(array); List<int> list = new List<int>(); list.Add(array[0]); for (int i = 1; i < array.Length; i++) { if (array[i] != array[i - 1]) { list.Add(array[i]); } } Console.WriteLine("去除重复数字后的数组:"); foreach (var item in list) { Console.Write(item + " "); } } } } ``` 上述代码首先对整数数组进行了升序排列,随后逐一扫描各位置上的数值并与前驱做对比决定是否保留下来。 --- ### 性能考量与适用范围总结 | 方案 | 时间复杂度 | 是否保持原序列 | 备注 | |------|------------|----------------|------| | `HashSet<T>` | 平均O(N)| 否 | 效率最高 | | 手动迭代筛选 (`List<T>`) | O(N²) | 是 | 易理解但低效 | | 排序加邻近检测 | O(N log N) | 否/部分可控 | 较平衡的选择 | 根据实际需求选取合适的策略至关重要。如果仅关心结果而不在乎次序关系的话推荐优先考虑采用哈希表类的技术路线;反之则需综合评估其它两种备选方案各自的优劣之处做出最佳抉择。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值