C#各类集合介绍

栏目: IT技术 · 发布时间: 4年前

内容简介:集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。平常在工作中List<T>集合是用的最多的,其次是Array(数组).今天整理一下各类形式的集合,不用就容易忘,必须要记录一下.Array:在内存上是连续分配的(可定义长度,也可不定义长度),Array中的元素类型要一样。

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

平常在工作中List<T>集合是用的最多的,其次是Array(数组).今天整理一下各类形式的集合,不用就容易忘,必须要记录一下.

Array

Array:在内存上是连续分配的(可定义长度,也可不定义长度),Array中的元素类型要一样。

Array通过坐标(索引)访问, 读取、修改快---增删慢

C#各类集合介绍

如果Array定义了长度,数据项就不能超过Array中的长度范围.

C#各类集合介绍

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();

C#各类集合介绍

链表不能通过元素索引访问。找元素只能遍历。增删比较快,增加或删除,只需把这个元素的前后两个元素指向的元素节点改一下。

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)

C#各类集合介绍

数组和链表(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 自定义对象要排序,就用这个指定

C#各类集合介绍

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接口,可以通过索引访问元素,像链表这种就不可以通过索引访问元素.

C#各类集合介绍

但是链表这种集合继承了ICollection类型的接口,因此可获得集合的长度(长度不定的集合都继承了ICollection接口)

C#各类集合介绍

IEnumerable\ICollection\IList\IQueryable
接口是标识功能的.不同的接口拆开就是为了接口隔离.实现不同的接口表明这个集合的功能不同.

任何数据集合都实现IEnumerable,IEnumerable为不同的数据结构(各种集合)提供了统一的数据访问方式(foreach)=》迭代器模式

the end!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件的奥秘

软件的奥秘

[美] V. Anton Spraul / 解福祥 / 人们邮电出版社 / 2017-9-1 / 49

软件已经成为人们日常生活与工作中常见的辅助工具,但是对于软件的工作原理,很多人却不是非常了解。 本书对软件的工作原理进行了解析,让读者对常用软件的工作原理有一个大致的了解。内容涉及数据如何加密、密码如何使用和保护、如何创建计算机图像、如何压缩和存储视频、如何搜索数据、程序如何解决同样的问题而不会引发冲突以及如何找出最佳路径等方面。 本书适合从事软件开发工作的专业技术人员,以及对软件工作......一起来看看 《软件的奥秘》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具