《Unity3D脚本编程》常用的数据结构

161 阅读2分钟
  • 之前写C++,最近在学习C#,总结一下常用的数据结构,文中会经常出现与C++的对比。
  • 本文不赘述数据结构所使用的方法,但你可以参考docs.microsoft.com/zh-cn/docum…

Array

  • 创建时必须指定长度

  • 只能存放相同类型,不存在装箱拆箱

  • 支持随机存取

  • C++只有矩形数组,C#支持交错数组。一般来说,交错数组性能更好,且由于引入多维,交错数组更灵活。

矩形数组

int [,] arr = new arr[2, 3];

交错数组

int [][] arr = new arr[2][3];

需要对每一个维度单独赋值。C++中这种 "使用两个方括号对" 的形式实际上是C#中的矩形数组,而不是交错数组

ArrayList

  • 动态长度
  • 可以存放不同类型的元素(存的都是Object),因此类型不安全,并且存在装箱拆箱
  • 支持随机存取

List

  • 泛型版本的ArrayList,类型安全,不存在装箱拆箱
  • 类似于C++中的vector

以上是数组的三个类型

LinkedList

  • 双向链表,有Next节点和Previous节点
  • 链表元素是LinkedListNode类型

Queue

  • Enqueue和Dequeue对应C++中的push和pop

Stack

  • C#中的Pop()会返回栈顶元素,而C++的pop()不会

Hashtable

  • 接受任意类型的值作为Key,因为System.Object中的GetHashCode方法可以返回一个唯一的整数,并且保证在对象的声明周期保持不变
  • 哈希冲突的解决方式采用的是二度哈希(rehashing, 或称double hashing)
  • 元素属于Object类型,类型不安全,存在装箱拆箱

Dictionary<K,T>

  • 泛型版本的Hashtable,类型安全,不存在装箱拆箱
  • 哈希冲突的解决方式采用的是链接技术(Chaining),也就是经常说的拉链法,发生冲突时,挂在当前位置(slot)的链表上