C#集合List<T>与HashSet<T>的区别,以及判断集合中是否存在重复的元素

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;
        }
    }
}
二、程序运行结果如图:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯内科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值