需求
大家都遇到有这种需求吧,类似一个网格的结构体,一般都会使用二维数组来实现。类似以下的代码:
int[][] array = new int[2][] { new int[] {0,11,12 }, new int[] {1,2,3,4,5 }};
for (int i = 0; i < array.Length; i++) {
foreach (int j in array[i]) {
Debug.Log ("i " + i + " j " + j);
}
}
这里二维数组在使用会带来一些不方便,或者说是问题:
1. 只能通过索引,进行某一行元素的遍历,不支持某以列的从上到下的遍历,同时遍历方向也是固定的,不能从反向进行遍历。
2. 内存会有一定多余,无法间隔定义元素,比如以上代码中,有两行,第一行三个数字,不能在0和11间插入几个“空”,只能使用0等进行占位,如果只是数字还好一些,如果元素是一个复杂的结构,就会多出很多无用的空间。特别是在设计一些稀疏表数据时,会消耗很大的内存资源。
3. 最致命的一点是,数组无法后期进行补充数据项,只能一开始就定义表的分布。当然如果使用单个List,索引的管理就会很繁琐。
4. 不支持一些高级功能,比如表合并、子表、持久化等功能。
设计
本文的目的是提供一个类似二维数组的操作的封装类,并解决以上问题。还是先上类图:
主要思路是使用Dictionary作为元素的基础存储结构,通过行、列组合成为索引值也就是字典的Key,元素作为Value进行保存,这样可以进行空间的有效利用,不会出现“空”块,访问速度也快。
主要类说明:
IZGrid定义表的基础行为,包括增/删/改/查等操作
IZGridIterator用于定义索引器,通过[i, j]和[i]的形式,进行所有元素和行的遍历,同时也支持Foreach进行遍历