C#各类集合汇总
集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。
平常在工作中List<T>集合是用的最多的,其次是Array(数组).今天整理一下各类形式的集合,不用就容易忘,必须要记录一下.
Array
Array:在内存上是连续分配的(可定义长度,也可不定义长度),Array中的元素类型要一样。
Array通过坐标(索引)访问,读取、修改快---增删慢
如果Array定义了长度,数据项就不能超过Array中的长度范围.
ArrayList
ArrayList:不定长度的,连续分配的
//元素没有类型限制 任何元素都当成object处理,如果是值类型会有装箱操作 ArrayList arrayList = new ArrayList(); arrayList.Add("object");//可以放string arrayList.Add(Enumerable.Range(1,100).ToArray());//可以放Array Func<string, int> func = m => 1; arrayList.Add(func);//可以放Delegate
//移除数据 arrayList.RemoveAt(0);//通过索引坐标移除 arrayList.Remove("object");//匹配第一个元素值,满足就移除
List
List:也是Array,内存上都是连续摆放的;不定长;泛型,保证类型安全,避免装箱拆箱(都是统一的类型)
var list = new List<int>() { 1, 2, 3 }; list.Add(1); list.AddRange(new List<int> { 4, 5, 6 });//批量添加 list.Any();//判断是否有数据 list.Clear();//清除所有数据 list.ForEach((m) => { });//foreach循环,参数=>viod委托 list.Skip(1).Take(2);//取索引为0之后的两条数据 //... ...
以上三种都属于Array类型,只要是Array类型都是读取快(可通过索引访问),增删慢.
LinkedList
LinkedList:双向链表 元素不连续分配,每个元素都有记录前后节点。
//在头部和尾部都标识了上一个元素和下一个元素所处位置 LinkedList<int> list = new LinkedList<int>(); list.AddLast(1); list.AddFirst(1); bool isBool = list.Contains(1);//判断链表中是否有1这个元素 LinkedListNode<int> list1 = list.Find(123);//找到元素123的这个节点 list.AddBefore(list1, 0);//前面增加 list.AddAfter(list1, 0);//后面增加 list.Remove(1); list.Remove(list1);//根据节点删除 list.RemoveFirst(); list.RemoveLast(); list.Clear();
链表不能通过元素索引访问。找元素只能遍历。增删比较快,增加或删除,只需把这个元素的前后两个元素指向的元素节点改一下。
Queue
Queue 队列,就是链表 先进先出
//用处;放任务延迟执行 A不断写入任务,B不断获取任务执行 每次拿最近的一个任务 Queue<string> queue = new Queue<string>(); queue.Enqueue("object");//添加数据 queue.Enqueue("object1"); foreach (var item in queue) { Console.WriteLine(item); } queue.Dequeue();//获取最先进入队列的元素,获得并移除 queue.Peek();//获取但不移除
Stack
Stack:栈 也是链表, 先进后出 先产生的数据最后使用
Stack<string> stack = new Stack<string>(); stack.Push("object");//添加数据 stack.Push("object1"); stack.Pop();//获取最后进入队列的元素 获得并移除 stack.Peek();//获取不移除
C#中(线程)栈的内存释放也是一样,先实例化的对象最后释放(在栈中声明的变量,最先声明的最后GC)
数组和链表(LinkedList、Queue、Stack)是他们内存分配的本质而区分的,元素连续分配和不连续分配.
Set类型集合
HashSet
HashSet:hash分布,元素间没关系(不用记录前后节点),动态增加.
HashSet<string> hashSet = new HashSet<string>(); hashSet.Add("object1");//添加元素 hashSet.Add("object2"); hashSet.Add("object3"); hashSet.Add("object1");//会自动去重 int count = hashSet.Count;//获得数量 hashSet.Contains("object"); HashSet<string> hashSet1 = new HashSet<string>(); hashSet1.Add("object1"); hashSet1.Add("object2"); hashSet1.Add("object4"); hashSet1.SymmetricExceptWith(hashSet);//补集:不包含hashSet1和hashSet共有的所有元素 hashSet1.UnionWith(hashSet);//并集:hashSet1和hashSet所有的元素 hashSet1.ExceptWith(hashSet);//差集:hashSet1有的元素而hashSet没有的元素 hashSet1.IntersectWith(hashSet);//交集:共同的元素 hashSet1.ToList(); hashSet1.Clear();
SortedSet
SortedSet:排序集合 去重+排序.SortedSet也可以做交差并补.
//IComparer<T>? comparer 自定义对象要排序,就用这个指定 SortedSet<string> sortedSet = new SortedSet<string>(); sortedSet.Add("object1"); sortedSet.Add("object2"); sortedSet.Add("object1");//会自动去重 int count = sortedSet.Count; sortedSet.Contains("object1");
HashTable(key-value)类型集合
Hashtable:
拿着key计算一个内存地址,然后放入key-value。长度不定,可以动态增加。放入的都是object类型,所以避免不了装箱拆箱。
//如果不同的key得到相同的内存地址,第二个在前面的地址上+1,由此会形成数组 //查找的时候,如果地址对应的key不对,那就+1查找//查找个数据 一次定位,增删查改都很快 //数据太多 重复定位,效率就下去了 Hashtable hashtable = new Hashtable(); hashtable.Add("key", "value"); hashtable[111] = 222;//KEY,VALUE foreach (DictionaryEntry item in hashtable) { Console.WriteLine(item.Key.ToString()); Console.WriteLine(item.Value.ToString()); } //线程安全 Hashtable.Synchronized(hashtable);//只有一个线程写,多个线程读
Dictionary:
相当于泛型版本的HashTable.因为数据基于泛型,减少了装箱拆箱的消耗.
Dictionary<int, string> pairs = new Dictionary<int, string>(); pairs.Add(1, "object1"); pairs[2] = "object2"; foreach (var item in pairs) { Console.WriteLine(item.Key.ToString(), item.Value); } pairs.ContainsKey(1);//是否存在这个key //... ...
SortedDictionary:
排序字典,依据key进行排序.因为要排序,所以增删改慢,多了一个排序
SortedDictionary<int, string> pairs = new SortedDictionary<int, string>(); //根据key依次排序 pairs.Add(1, "object1"); pairs.Add(2, "object2"); pairs.Add(3, "object3"); pairs.Add(4, "object4");
SortedList:
也是key,value形式,自动排序.不能重复添加,key重复会报错
IComparer comparer 自定义对象要排序,就用这个指定
SortedList sortedList = new SortedList(); sortedList.Add("2", "1"); var keyList = sortedList.GetKeyList(); var valueList = sortedList.GetValueList(); sortedList.TrimToSize();//用于最小化集合的内存开销 sortedList.Remove("1");//根据key值移除 sortedList.RemoveAt(0);//根据索引移除 sortedList.Clear();//移除所有元素
字典集合线程不安全(非线程安全),这块内存多个线程都可以改 ConcurrentQueue 线程安全版本的Queue ConcurrentStack 线程安全版本的Stack ConcurrentBag (List集合是非线程安全的)ConcurrentBag线程安全版本的对象集合 ConcurrentDictionary 线程安全版本的Dictionary BlockingCollection 线程安全集合
ArrayList和List都实现了IList接口,可以通过索引访问元素,像链表这种就不可以通过索引访问元素.
但是链表这种集合继承了ICollection类型的接口,因此可获得集合的长度(长度不定的集合都继承了ICollection接口)
IEnumerable\ICollection\IList\IQueryable
接口是标识功能的.不同的接口拆开就是为了接口隔离.实现不同的接口表明这个集合的功能不同.任何数据集合都实现IEnumerable,IEnumerable为不同的数据结构(各种集合)提供了统一的数据访问方式(foreach)=》迭代器模式
以上就是C#各类集合汇总的详细内容,更多关于c# 集合的资料请关注猪先飞其它相关文章!
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25