数组结构:

Array :在内存上是连续分配的,而且元素类型是一致的;

特点:是读取快 可以坐标访问 但是增删慢,长度不能变

比如 int[] intArray=new int[20]; intArray[3]=10;

ArrayList:在内存上是连续分配的,元素没有类型限制,任何元素都是当成object处理的,如果是值类型,会有装箱操作

不定长度的  Add增加长度 索引赋值不会增加长度;读取快  增删慢;

ArrayList arrayList=new ArrayList();

arrayList.Add("001");

arrayList.Add("002");

arrayList.Remove("Eleven");

array[2]=32;

//删除数据

List:核心也是Array 内存上是连续分配的 可以用索引访问 不定长度 ;泛型,保证类型安全,避免装箱拆箱;读取快,增删慢;

List<string> stringList=new List<string>();

stringList.Add("001");

链表类型

LinkedList:泛型的,链表 元素不连续分配,每个元素都有记录前后节点;

不能通过坐标访问, 找元素,只能遍历,查找不方便;增删比较方便;

LinkedList<int> linkedList=new LinkedList<int>();

linkedList.AddFirst(1);

linkedList.AddLast(10);

bool isContain=linkedList.Contains(123);

LinkedListNode<int> node123=linkedList.Find(123);

linkedList.AddBefore(node123,10);

linkedList.AddAfter(node123,11);

linkedList.Remove(123);

linkedList.RemoveFirst();

linkedList.RemoveLast();

Queue: 队列,就是链表, 先进先出, 如任务延迟执行,A不断地写入任务 B不断获取任务去执行;

Queue<int> numbers=new Queue<int>();

numbers.Enqueue(1);

numbers.Enqueue(2);

numbers.Enqueue(3);

numbers.Dequeue();//移除

numbers.Peek();//不移除

Stack: 栈,是链表, 先进后出

Stack<int> numbers=new Stack<int>();

numbers.Push(1);

numbers.Push(2);

numbers.Push(3);

numbers.Push(4);

numbers.Pop();//读取并移除

numbers.Peek();//读取不移除

集合Set

HashSet:hash分布 元素间没有关系 动态增加的 会自动去重 不是连续分布 不能用索引坐标访问

统计用户IP,IP投票;还可以做交叉并补的集合

HashSet<int> hashSet=new HashSet<int>();

hashSet.AddFirst(1);

hashSet.AddFirst(1);

hashSet.AddFirst(2);

hashSet.AddFirst(3);

hashSet.AddLast(10);

HashSet<int> hashSet1=new HashSet<int>();

hashSet1.AddFirst(1);

hashSet1.AddFirst(2);

hashSet1.AddLast(3);

hashSet1.AddLast(7);

hashSet1.IntersectWith(hashSet);//交集 1、2、3

hashSet1.UnionWith(hashSet);//并集1、2、3、7、10

hashSet1.ExceptWith(hashSet);//差集 10

hashSet1.SymmetricExceptWith(hashSet);//补集 7

*交叉并补只能执行一次*

SortedSet:排序的集合,可以去重加排序;也可以做交叉并补

SortSet<int> sortSet=new SortSet<int>();

sortSet.AddFirst(1);

sortSet.AddFirst(1);

sortSet.AddFirst(2);

sortSet.AddFirst(3);

sortSet.AddLast(10);

Key-Value

HashTable:key—value 体积可以动态增加 拿着key计算一个地址,然后放入key-value

object-装箱拆箱 如果是不同的key得到相同的地址,第二个在前面地址上+1

查找的时候,如果地址对应的数据key不对,那就+1查找。。

浪费了空间 基于数组实现

查找数据 一次定位 增删 一次定位;增删改查 都很快

浪费空间,数据太多 重复定位 效率就下去了

HashTable table=new HashTable();

table.Add("1","0001");

table.Add("2","0004");

table["3"]="0003";

线程安全

Hashtable.Synchronized(table);//只有一个线程写 多个线程读

Dictionary:泛型 key-value 读写增删改查都很快 有序的

Dictionary<int,string> dic=new Dictionary<int,string> ();

dic[1]="1";

SortedDictionary:泛型 key-value 读写增删改查都很快 有序的

SortedDictionary<int,string> dic=new SortedDictionary<int,string> ();

dic[1]="1";

SortedList:泛型 key-value 读写增删改查都很快 有序的 按照key排序

SortDictionary<int,string> dic=new SortDictionary<int,string> ();

dic[1]="1";

ILIst、IQueryable、IEnumerable、ICollection

接口是标识功能的,不同的接口拆开,为了接口隔离,尽管有重复

IList 可以下标访问

IEnumerable 遍历才会查询比较 迭代器yield  任何数据集合 都实现了不同的数据结构,提供了统一的访问接口 yield访问模式

IQueryable 表达式目录树解析 延迟到遍历的时候才会去执行

C# 数组结构的更多相关文章

  1. jquery类数组结构学习笔记

    大家都知道我们使用$()产生的jquery对象可以使用下标去获取对应下标的元素. 举个栗子,一个页面有5个div标签,我们使用$("div")去获取到这些元素,然后我们就可以使用$ ...

  2. java实现无序数组结构

    一.数组的2种定义方式 数据类型 []  数组名称 = new 数据类型[数组长度]; 这里 [] 可以放在数组名称的前面,也可以放在数组名称的后面,一般放在名称的前面 数据类型 [] 数组名称 = ...

  3. Array数组结构底层实现复习

    Array数组结构底层实现复习 内容待总结: size capacity length

  4. JS 树形结构与数组结构相互转换、在树形结构中查找对象

    总是有很多需求是关于处理树形结构的,所以不得不总结几个常见操作的写法.¯\_(ツ)_/¯ 首先假设有一个树形结构数据如下 var tree=[ { 'id': '1', 'name': '教学素材管理 ...

  5. JS数据结构与算法-数组结构

    数组结构 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构. 数组通常情况下用于存储一系列同一种数据类型的值. 但在JavaScript里,也可以在数组中保存不同类型的值. 但我们 ...

  6. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  7. C数组&结构体&联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  8. c++ 数组 结构体

    接下来的一点时间我将会记录下我看的c++的一些心得体会,人贵在坚持,希望我可以一直坚持下去!!Go Fighting!   一.c++复合数据类型: 数组类型的一些注意事项: sizeof的用法: 当 ...

  9. C89,C99: C数组&结构体&联合体快速初始化

    1. 背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组 ...

随机推荐

  1. ad9361自测试校准

    #include "config.h" #include "CONFIG_FPGA_ALL.h" #include "xparameters.h&qu ...

  2. 六 java和Tomcat

    Java企业级应用TOMCAT实战 http://blog.oldboyedu.com/java-tomcat/ 老男孩笔记 常规应用架构模型 Tomcat对静态请求效率低,可以做动静分离,动态的给T ...

  3. swoole TCPsever

    <?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0.1", 9501); $s ...

  4. Windows 2008 R2防火墙,允许被ping的设置方法

    这篇文章主要介绍了Windows 2008 R2防火墙,允许被ping的设置方法,需要的朋友可以参考下   1.准备 1)原因 出于安全因素考虑,在Windows 2008 R2上是不允许从外部对其P ...

  5. .net core 2.1 Ef 连接Mysql数据库 DB first

    本文介绍.net core2.1版本下 Mysql数据库采用DB first方式使用Ef 点击查看更简单的方法 1. 新建基于.net core2.1的项目(略) 2. 从nuget中引用Micros ...

  6. Netty 学习系列

    Netty实现httpserver简单示例 3个Java类实现最基本的接收请求,响应一个文本的简单http服务器. https://www.cnblogs.com/demingblog/p/99707 ...

  7. sql server managerment 给表加说明

    右击表 =>点属性  =>扩展属性 =>加 MS_Description

  8. Vray

    VRay是由chaosgroup和asgvis公司出品,中国由曼恒公司负责推广的一款高质量渲染软件.

  9. Falsy Bouncer 过滤数组假值

    过滤数组假值 (真假美猴王) 删除数组中的所有假值. 在JavaScript中,假值有false.null.0."".undefined 和NaN. function bounce ...

  10. [开源]使用C# 对CPU卡基本操作封装

    Github 地址:https://github.com/zifeiniu/CPUCardLib 项目需求及简介: 公司要求将用户相关的信息储存到射频卡中,之前项目使用的Mifare类型卡,只储存了用 ...