泛型List、HashTable

从最开始接触的数组,到非泛型集合类(ArrayList、HashTable、Queue、Stack)、泛型集合类(List<T>、Dictionary<T>、Queue<T>、Stack<T>), 实际运用中,他们各自有自己的应用领取,就好比刚开始学习英语的时候,有很多个单词都可以翻译成憎恨的意思,但总是混淆不清楚,实际上每个单词的使用场合、语气色彩都不尽相同。根据场景的需要,使用正确的单词,表达正确的感情。同样适用于编程。

数组: 适用于明确长度无需在其中做插入操作的一组相同类型的数据,因为定义数组的时候,就必须申明长度,如果过长,浪费内存,过短后期又会导致数据溢出

非泛型集合类: 可适用一组不同类型的数据,内部自动完成装箱、拆箱(Object)操作,适用广泛,但是损耗内存

泛型集合类:相同类型的一组数据,避免了装箱、拆箱 造成的内存损耗

关于 List 操作,有简单类型操作

          List<string> strList = new List<string>();
          strList.Add("123");
          strList.Add("456");

          Console.WriteLine(strList[0]);

如果有相同类型 List<string> list2 对象,将两个对象进行合并,则遍历、累加即可

            List<string> strList2 = new List<string>()
            {
                "asd","222","sdfds"
            };

            foreach (var item in strList2)
            {
                strList.Add(item);
            }

对于List<Model>  操作,亦如此

            List<User> sUsers = new List<User>();

            var newdata = new User
            {
                Name = "sdf",UserId = 1001,Sex = "男"
            };

            sUsers.Add(newdata);

然后,合并

            List<User> users = new List<User>()
            {
               new User() {Name = "a",UserId = 1001,Sex = "男"},
               new User() {Name = "b",UserId = 1001,Sex = "男"},
               new User() {Name = "c",UserId = 1001,Sex = "男"},
               new User() {Name = "d",UserId = 1001,Sex = "男"}
            };

            foreach (var item in users)
            {
                sUsers.Add(item);
            }

关于字典集合类Dictionary<T>, 键值对格式,申明时定义 Key 和 value 各自的类型,然后赋值、取值、用值

与其相对的HashTable ,同样也是键值对格式,只是无需申明类型,随存随取随用

            Dictionary<int,string> dictionary = new Dictionary<int, string>();
            dictionary.Add(1,"aaa");  //增加元素
            dictionary.Remove(1);     //移除指定元素
            dictionary.Clear();       //移除所有元素
            bool bo = dictionary.ContainsKey(1);  //判斷指定元素
            Hashtable hashtable = new Hashtable();
            hashtable.Add("123","123");  //增加元素
            hashtable.Add(22,324);
            hashtable.Add(1, "aaa");
            hashtable.Remove(1);     //移除指定元素
            hashtable.Clear();       //移除所有元素
            bool b = hashtable.ContainsKey(1);  //判斷指定元素

可以看出,Hashtable 对象的内部也是键值对格式,其类型均为 object ,这样使用无类型限制,但是内部集成了装箱、拆箱操作,增大系统内存的消耗

相同点:调用方法相同,均无序,不可使用索引

不同点:一个是泛型,一个非泛型

以上介绍的集合都可以设置重复的数据,为了避免这种重复的数据存储,.NET提供集合名称集。这是一个具有不同项目的集合类型。

还有两种类型的集合,SortedSet和HastSet。

对于HashSet  主要用来对两个集合求交集、并集、差集等操作,处理包含以上的方法外,还有

            HashSet<int> name1 = new HashSet<int>();
            name1.Add(8);
            name1.Add(3);

            HashSet<int> name2 = new HashSet<int>();
            name2.Add(4);
            name2.Add(5);

            name1.UnionWith(name2);       //求兩集合的并集
            name1.IntersectWith(name2);   //求两集合的交集
            name1.ExceptWith(name2);      //求两集合的差集,name1-name2,若无相等,则值为name1
            name1.SymmetricExceptWith(name2);  //求两集合的对称差集,若无相等,则值为name1+name2,若有则去同后的name1+name2

SortedSet按照排序顺序存储数据,调用方法参照HashSet,仅仅是返回的结果中自动排序

----市人皆大笑,举手揶揄之

时间: 2024-08-05 16:33:29

泛型List、HashTable的相关文章

c#重点[集合类型]异常,数组,集合ArrayList,List&lt;&gt;,hashTable,hashtable泛型(Dictionary)

1.foreach[对一些数组或集合进行遍历] foreach(类型 变量名 in 集合对象){语句体} 1 //定义一个数组 2 int [] sNum1={19,33,27,57,45,43 }; 3 foreach(var i in sNum1) 4 { 5 Console.WriteLine(i); 6 } foreach for循环 1 int[] str1 = {19,33,27,57,45,43 }; 2 //for循环遍历 3 for (int i=0;i<str1.length

HashTable和Dictionary的区别

1.hashtable表示键值对的集合.在.net framework中,hashtable是system.collection命名空间提供的一个容器,用于处理和表现类似key-value的键值对,其中key通常可用来快速查找,同时key区分大小写:value用于存储对应于key的值.hashtable中key-value键值对均为object类型,所以hashtable可以支持任何类型的key-value键值对,任何非null对象都可以作为键和值. 在哈希表中添加一个key键值对:hashta

.NET面试题系列[11] - IEnumerable&lt;T&gt;的派生类

“你每次都选择合适的数据结构了吗?” - Jeffery Zhao .NET面试题系列目录 ICollection<T>继承IEnumerable<T>.在其基础上,增加了Add,Remove等方法,可以修改集合的内容.IEnumerable<T>的直接继承者还有Stack<T>和Queue<T>. 所有标准的泛型集合都实现了ICollection<T>.主要的几个继承类有IList<T>,IDictionary<K

C# 之 集合整理

集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问):一个集合包括多个元素,即有一个集合类对象和N个元素对象. BCL(Base Class Library, 基类库)中集合类型分为泛型集合与非泛型集合.非泛型集合的类和接口位于System.Collections命名空间.泛型集合的类和接口位于System.Collections.Generic命名空间. IEnumerable<T>和IEnumerable是所有集合或集合接口的基接口,所有集合接口或集合都继承

C#: 集合

摘自http://www.cnblogs.com/kissdodog/archive/2013/01/29/2882195.html 先来了解下集合的基本信息 1.BCL中集合类型分为泛型集合与非泛型集合. 2.非泛型集合的类和接口位于System.Collections命名空间. 3.泛型集合的类和接口位于System.Collections.Generic命名空间. ICollection接口是System.Collections命名空间中非泛型集合类的基接口,它继承自IEnumerable

【C#复习总结】探究各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字

前言 先普及一下线程安全和类型安全 线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态标量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量

.NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题

集合 1. Array(数组): 分配在连续内存中,不能随意扩展,数组中数值类型必须是一致的.数组的声明有两种形式:直接定义长度,然后赋值:直接赋值. 缺点:插入数据慢. 优点:性能高,数据再多性能也没有影响 特别注意:Array不是线程安全,在多线程中需要配合锁机制来进行,如果不想使用锁,可以用ConcurrentStack这个线程安全的数组来替代Array. 2. ArrayList(可变长度的数组) 不必在声明的时候指定长度,即长度可变:可以存放不同的类型的元素.    致命缺点:无论什么

两数之和(hash初接触)

2019年10月4日记录 List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构,在c#中,我们实例化list时,如果不指定容量,则内部会生成一个静态的空数组,有添加操作时,实例化为一个长度为4的数组,满了以后,自动扩充为两倍的容量 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有Hashtable,Dictionary,Hashtable继承自Map,实现一个key-value映射的关系.Dictionary则是一种泛型

C# - ArrayList与Hashtable及其泛型版本

C#的集合类继承关系UML图: ICollection - ICollection<T> ICollection:所有非泛型集合的大小.枚举器和同步方法 public interface ICollection : IEnumerable { int Count { get; } bool IsSynchronized { get; } // 对ICollection的访问是否是同步的(线程安全) object SyncRoot { get; } // 获取可用于对ICollection同步访

c# 图解泛型List&lt;T&gt;, HashTable和Dictionary&lt;TKey,TValue&gt;

前辈在代码中使用了HashTable,由于我用的比较少,不能理解,为什么不用Dictionary?看了源码以及查阅资料,总结如下: 首先看看它们的继承体系: 我把list<T>的继承体系也一并画出来,因为c#集合中List<T>和Dictionary<T>这两种数据结构实在太常用了.从上图中可以看到Dictionary和HashTable都继承于IDictionary.既然父辈都相同,那么注定会有很多相似的地方.那么它们又会有哪些不同呢? 这个还得研究源码,先看看Has