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(,).ToArray());//可以放Array
Func<string, int> func = m => ;
arrayList.Add(func);//可以放Delegate
//移除数据
arrayList.RemoveAt();//通过索引坐标移除
arrayList.Remove("object");//匹配第一个元素值,满足就移除
List
List:也是Array,内存上都是连续摆放的;不定长;泛型,保证类型安全,避免装箱拆箱(都是统一的类型)
var list = new List<int>() { , , };
list.Add();
list.AddRange(new List<int> { , , });//批量添加
list.Any();//判断是否有数据
list.Clear();//清除所有数据
list.ForEach((m) => { });//foreach循环,参数=>viod委托
list.Skip().Take();//取索引为0之后的两条数据
//... ...
以上三种都属于Array类型,只要是Array类型都是读取快(可通过索引访问),增删慢.
LinkedList
LinkedList:双向链表 元素不连续分配,每个元素都有记录前后节点。
//在头部和尾部都标识了上一个元素和下一个元素所处位置
LinkedList<int> list = new LinkedList<int>();
list.AddLast();
list.AddFirst();
bool isBool = list.Contains();//判断链表中是否有1这个元素 LinkedListNode<int> list1 = list.Find();//找到元素123的这个节点
list.AddBefore(list1, );//前面增加
list.AddAfter(list1, );//后面增加 list.Remove();
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[] = ;//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(, "object1");
pairs[] = "object2";
foreach (var item in pairs)
{
Console.WriteLine(item.Key.ToString(), item.Value);
}
pairs.ContainsKey();//是否存在这个key
//... ...
SortedDictionary:排序字典,依据key进行排序.因为要排序,所以增删改慢,多了一个排序
SortedDictionary<int, string> pairs = new SortedDictionary<int, string>();
//根据key依次排序
pairs.Add(, "object1");
pairs.Add(, "object2");
pairs.Add(, "object3");
pairs.Add(, "object4");
SortedList: 也是key,value形式,自动排序.不能重复添加,key重复会报错
IComparer comparer 自定义对象要排序,就用这个指定

SortedList sortedList = new SortedList();
sortedList.Add("", "");
var keyList = sortedList.GetKeyList();
var valueList = sortedList.GetValueList();
sortedList.TrimToSize();//用于最小化集合的内存开销
sortedList.Remove("");//根据key值移除
sortedList.RemoveAt();//根据索引移除
sortedList.Clear();//移除所有元素
字典集合线程不安全(非线程安全),这块内存多个线程都可以改
ConcurrentQueue 线程安全版本的Queue
ConcurrentStack 线程安全版本的Stack
ConcurrentBag (List集合是非线程安全的)ConcurrentBag线程安全版本的对象集合
ConcurrentDictionary 线程安全版本的Dictionary
BlockingCollection 线程安全集合
ArrayList和List都实现了IList接口,可以通过索引访问元素,像链表这种就不可以通过索引访问元素.

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

IEnumerable\ICollection\IList\IQueryable
接口是标识功能的.不同的接口拆开就是为了接口隔离.实现不同的接口表明这个集合的功能不同. 任何数据集合都实现IEnumerable,IEnumerable为不同的数据结构(各种集合)提供了统一的数据访问方式(foreach)=》迭代器模式
the end!
C#各类集合介绍的更多相关文章
- java集合介绍(List,Set,Map)
前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...
- HashSet集合介绍和哈希值
HashSet集合介绍 ~java.util.Set接口 extends Collection 接口~Set接口的特点: 1.不允许存储重复的元素 2.没有索引,没有带索引的方法,也不能使用普通的fo ...
- C#语言各种集合介绍
集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)一个集合包括多个元素,即有一个集合类对象和N个元素对象 因为任何集合类都实现了IEnumerable接口,所以任何集 ...
- JAVA集合介绍
一.集合概述 Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储.而数组长度固定,不能满足变化的要求.所以,java提供了集合. 特点 1. 长度可以发 ...
- HashSet HashTable HashMap的区别 及其Java集合介绍
(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...
- Java 集合介绍
1, Set :集合中对象不按特定的方式排序,并且没有重复对象,它有些实现类能对集合按特定方式排序 List :集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索独享,Li ...
- Java基础(40):Java中的集合介绍---Collection与Map
集合类说明及区别Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap ...
- Java 集合-集合介绍
2017-10-30 00:01:09 一.Java集合的类关系图 二.集合类的概述 集合类出现的原因:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类. ...
- python集合介绍
set原理 Python 还 包 含 了 一 个 数 据 类 型—— set ( 集 合 ) . 集 合 是 一 个 无 序 不 重 复 元素 的 集 . 基 本 功 能 包 括 关 系 测 试 和 ...
随机推荐
- Flume-1.4.0和Hbase-0.96.0整合
在使用Flume的时候,请确保你电脑里面已经搭建好Hadoop.Hbase.Zookeeper以及Flume.本文将以最新版的Hadoop-2.2.0.Hbase-0.96.0.Zookeeper-3 ...
- Android学习笔记字符串资源
在新建好的Android项目里res目录下有个字符串资源文件 在xml文件中引用字符串资源 string.xml <resources> <string name="mot ...
- 几款一元单片机对比:CMS8S5880、STM8S003、N76E003
大概17年开始,STM8S003的价格被贸易商炒货,变得很不稳定,一度上涨到2~3元,因为市场需求大增,小家电.无线充和一些简单功能的产品,本人就有在空气净化器.433M触摸开关.数据收发模块.红外控 ...
- MAC App破解之路十 Particle Design
这个软件破解非常简单: 修改: [PaddleStatic Yz6nrtNwF4].直接返回1 效果:
- DP:0-1背包问题
[问题描述] 0-1背包问题:有 N 个物品,物品 i 的重量为整数 wi >=0,价值为整数 vi >=0,背包所能承受的最大重量为整数 C.如果限定每种物品只能选择0个或1个,求可装的 ...
- C语言实现类
#ifndef __DEFINE__H__ #define __DEFINE__H__ #define vector3(type) \ typedef struct vector3_##type { ...
- intellij配置github
一.在IDEA中设置Git,在File-->Setting->Version Control-->Git-->Path to Git executable选择你的git安装后的 ...
- HttpClient优化
HttpClient优化思路: 1.池化 2.长连接 3.httpclient和httpget复用 4.合理的配置参数(最大并发请求数,各种超时时间,重试次数) 5.异步 6.多读源码 1.背景我们有 ...
- jni 字符串的梳理 2 字符串的处理操作
我们实现下面的一个功能: 1.首先在java层传递一个字符串到c层,c层首先将jstring转换成char*类型,然后将两个字符串相加,然后再再将char*类型转换成jstring,在上层显示出来 我 ...
- VMware 15安装Ubuntu 16.04并配置环境
VMware(虚拟机)是指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统,它能在Windows系统上虚拟出多个计算机,每个虚拟计算机可以独立运行,可安装各种软件与应用等 ...