C#中常用容器的使用与底层数据结构,特点(2)hash集合,二叉树集合,

hash集合类型:HashSet<>,Hashtable,Dictionary<>

 和线性集合比较,hash集合特点在于,通过索引键值来访问,

(HashSet除外,存储一系列对象,而不是键值对)

Hashtable 几乎等于Dictionary<object,object>,它是非类型安全的,即需要装箱拆箱

Hashtable迭代元素为DictionaryEntry类型

Dictionary迭代元素为KeyValuePair类型

200_000条数据

-----------------------------------------------------------------------

二叉树集合类型:SortedList<>,SortedSet<>,SortedDictionary<>

最大区别在于,二叉树类型集合根据键自动排序的,不管先后插入,

遍历List<>,SortedDictionary<>都是KeyValuePair类型

因而明显速度慢于hash集合,200_000条数据

建议调试查看集合中数据顺序,

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;

namespace CollectionDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            TestHashSet();
            TestHashtable();
            TestDictionary();
            Console.ReadKey();
           
        }

        public static void TestHashSet() {
            HashSet<int> hs = new HashSet<int>();
            for (int i = 0; i < 10; i++)
            {
                hs.Add(i);
            }
            hs.Remove(5);
            bool flag=hs.Contains(2);
            int[] t = new int[10];
            //int s=hs[2];
            
            foreach (int item in hs)
            {

            }
            hs.CopyTo(t);
            hs.ExceptWith(new int[]{ 1,3,5});
            //int tt = hs[5];
            //测试性能
            Stopwatch sw = new Stopwatch();
            HashSet<int> hashset = new HashSet<int>();
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                hashset.Add(i);
            }
            Console.WriteLine($"hashset.Add():{sw.ElapsedMilliseconds}ms");
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                hashset.Remove(i);
            }
            Console.WriteLine($"hashset.Remove():{sw.ElapsedMilliseconds}ms");
        }

        public static void TestHashtable() {
            Hashtable ht = new Hashtable();
            ht.Add("1", 1);
            ht.Add(1,1);
            //可以通过索引器访问,
            object o = ht[""];
            //不让重复
            //ht.Add("1",2);
            ICollection keys = ht.Keys;
            bool f=ht.Contains("2");

            //int类型,竟然没有报错
            foreach (DictionaryEntry item in ht)
            {
                Console.WriteLine(item.Value);
            }

            Stopwatch sw = new Stopwatch();
            Hashtable hastable = new Hashtable();
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                hastable.Add(i,i);
            }
            Console.WriteLine($"hashtable.Add():{sw.ElapsedMilliseconds}ms");
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                hastable.Remove(i);
            }
            //不用调整索引下标顺序,效率还可以
            //不过官方宣称 https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.hashtable?view=netcore-3.1
            //建议不要将 Hashtable 类用于新的开发。 相反,我们建议使用泛型 Dictionary<TKey,TValue> 类。 
            //但是话又说回来,对于一系列不同类型的键值对来说,好像也挺香的
            //对于替换方式便是Dictionary<object,object>
            Console.WriteLine($"hashtable.Remove():{sw.ElapsedMilliseconds}ms");
        }

        public static void TestDictionary()
        {
            Dictionary<string, int> dic = new Dictionary<string,int>();
            dic.Add("b", 2);
            dic.ContainsKey("");
            dic.Remove("");
            //可以通过索引器访问,
            //必须判断key存在,才能访问
            int d =dic["b"];
            //dic.s
            //ht.Add("1",2);
            ICollection keys = dic.Keys;
            bool f = dic.ContainsValue(4);

            foreach (KeyValuePair<string,int> item in dic)
            {
                Console.WriteLine(item.Value);
            }

            Stopwatch sw = new Stopwatch();
            Dictionary<string, int> dictionary =new Dictionary<string, int>();
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                dictionary.Add(i.ToString(), i);
            }
            Console.WriteLine($"dictionary.Add():{sw.ElapsedMilliseconds}ms");
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                dic.Remove(i.ToString());
            }
            //不用调整索引下标顺序,效率还可以
            Console.WriteLine($"dictionary.Remove():{sw.ElapsedMilliseconds}ms");

            
        }
        //放‘少量有限的一对对的数据’
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;

namespace SortedDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            TestSortedDictionary();
            TestSortedList();
            TestSortedSet();
            Console.WriteLine("Hello World!");
        }

        public static void TestSortedDictionary() {
            SortedDictionary<string, int> sdic = new SortedDictionary<string, int>();
            sdic.Add("",1);
            sdic.Add("1",2);
            sdic.Add("4", 2);
            sdic.Add("3", 2);
            sdic.Add("2", 2);
            sdic.Remove("");

            foreach (KeyValuePair<string,int> item in sdic)
            {

            }
            //测试性能
            Stopwatch sw = new Stopwatch();
            SortedDictionary<string, int> sdic1 = new SortedDictionary<string, int>();
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                sdic1.Add(i.ToString(),i);
            }
            Console.WriteLine($"SortedDictionary.Add():{sw.ElapsedMilliseconds}ms");

            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                sdic1.Remove(i.ToString());
            }
            Console.WriteLine($"SortedDictionary.Remove():{sw.ElapsedMilliseconds}ms");
        }

        public static void TestSortedList()
        {
            //SortedList<string> si11 = new SortedList<string>();
            //使用泛型需要两个参数
            SortedList sl = new SortedList();
            
            //sl.Add(2, "2");
            //必须同一类型
            sl.Add("1", "");
            sl.Add("3", "3");
            SortedList<string,int> si = new SortedList<string,int>();
            si.Add("",1);
            foreach (string item in sl)
            {

            }
            foreach (KeyValuePair<string,int> item in si)
            {

            }
            //测试性能
            Stopwatch sw = new Stopwatch();
            SortedList<string, int> si1 = new SortedList<string, int>();
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                si1.Add(i.ToString(), i);
            }
            Console.WriteLine($"SortedList.Add():{sw.ElapsedMilliseconds}ms");

            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                si1.Remove(i.ToString());
            }
            Console.WriteLine($"SortedList.Remove():{sw.ElapsedMilliseconds}ms");
        }

        public static void TestSortedSet()
        {
            //SortedSet ts = new System.Collections.Generic.SortedSet();
            SortedSet<int> ss = new SortedSet<int>();
            ss.Add(1);
            ss.Add(4);
            ss.Add(2);
            ss.Remove(1);

            foreach (int item in ss)
            {

            }
            //测试性能
            Stopwatch sw = new Stopwatch();
            SortedSet<int> ss1 = new SortedSet<int>();
            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                ss1.Add(i);
            }
            Console.WriteLine($"SortedSet.Add():{sw.ElapsedMilliseconds}ms");

            sw.Restart();
            for (int i = 0; i < 200_000; i++)
            {
                ss.Remove(i);
            }
            Console.WriteLine($"SortedSet.Remove():{sw.ElapsedMilliseconds}ms");
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值