C#中 HashSet 和 List 都可以存放指定类型的元素。
HashSet 存储的数据是无序并且唯一的,底层使用HashMap存储数据。
List存储的数据是有序并且可以重复的。 采用链表存储数据。
因HashSet存储的数据时唯一的,可以使用HashSet来判定集合中是否存在重复的元素。
一、使用控制台应用程序验证如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ListAndHashSetDemo
{
class Program
{
static void Main(string[] args)
{
//HashSet 存储的数据是无序并且唯一的,底层使用HashMap存储数据。
//因HashSet存储的数据时唯一的,可以使用HashSet来判定集合中是否存在重复的元素
HashSet<string> hashSet = new HashSet<string>();
//HashSet添加元素Add函数,返回是否添加成功:如果元素已存在则不添加,返回false。如果元素不存在则添加,返回true
bool addResult = hashSet.Add("AA");
Console.WriteLine($"添加元素AA:{(addResult ? "成功" : "失败")}");
addResult = hashSet.Add("BB");
Console.WriteLine($"添加元素BB:{(addResult ? "成功" : "失败")}");
addResult = hashSet.Add("AA");
Console.WriteLine($"添加元素AA:{(addResult ? "成功" : "失败")}");
addResult = hashSet.Add("CC");
Console.WriteLine($"添加元素CC:{(addResult ? "成功" : "失败")}");
Console.WriteLine("遍历HansSet的元素:");
hashSet.ToList().ForEach(s => Console.WriteLine(s));
//List存储的数据是有序并且可以重复的,通过索引访问。 采用链表存储数据。
Console.WriteLine("------下面测试List<T>------");
List<string> list = new List<string>();
list.Add("AA");
list.Add("BB");
list.Add("AA");
list.Add("CC");
Console.WriteLine("遍历List的元素:");
list.ForEach(s => Console.WriteLine(s));
Console.WriteLine("因HashSet存储的数据时唯一的,可以使用HashSet来判定集合中是否存在重复的元素");
Console.WriteLine($"List是否存在重复的元素:{list.ExistDuplicate()}");
string elementDuplicate;
bool isDuplicate = DuplicateUtil.ExistDuplicate(list, out elementDuplicate);
Console.WriteLine($"是否存在重复的元素:{isDuplicate},重复的元素是:{elementDuplicate}");
Console.ReadLine();
}
}
/// <summary>
/// 判断集中中是否存在重复的元素
/// </summary>
public static class DuplicateUtil
{
/// <summary>
/// 扩展方法:判断集合中是否存在重复的元素
/// 扩展方法:方法所在的类(类名可以是任意的)一定是静态的,参数指代某种类型的扩展方法,类型前面加this关键字,比如Method(this T)代表类型T的扩展方法Method。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
public static bool ExistDuplicate<T>(this IEnumerable<T> list)
{
HashSet<T> hashset = new HashSet<T>();
return list.Any(e => !hashset.Add(e));
}
/// <summary>
/// 判断是否有重复的元素,并 返回第一个重复的元素
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="t"></param>
/// <returns></returns>
public static bool ExistDuplicate<T>(IEnumerable<T> list, out T t)
{
t = default(T);
if (list == null)
{
return false;
}
HashSet<T> hashset = new HashSet<T>();
foreach (T item in list)
{
//如果添加数据失败,说明有重复的元素
if (!hashset.Add(item))
{
t = item;
return true;
}
}
return false;
}
}
}
二、程序运行结果如图: