.NET中数组的隐秘特性[12]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 dy_2000_abc 的 blog

访问

 

对某一索引的元素的访问的前提是该索引之前的所有元素都已经添加。比如下面的代码会发出异常:

arraylist al=new arraylist();

al[0]=1;


       array与arraylist之间的相互转换是很方便的。arraylist.adapter方法用来将array转换成arraylist,toarray方法用来将arraylist转换成array。
       你可以使用下面的办法来访问arraylist维护的内部数组:(object[]) sb.gettype().getfield("_items", bindingflags.nonpublic|bindingflags.instance).getvalue(arraylist),这是toarray的一个替代方法。与toarray相比,这一方法减少了内存和时间上的开销。但需要注意的是,这种方法得到的数组的长度是arraylist的容量,而不是实际元素的个数。
不借助arraylist类对array进行操作
改变数组的大小

       我个人认为,数组应该提供一个方法用来改变数组的大小。下面我写的这个方法模仿arraylist的行为,你可以使用它来改变数组的大小。
public static array resize(array array, int newsize)
    {
        type type = array.type;
        array newarray = array.createinstance(type.getelementtype(), newsize);
        array.copy(array, 0, newarray, 0, math.min(newarray.length, newsize))l
        return newarray;
    }
移动数组
       array类提供了一个copy方法用来在一个数组与另外一个数组之间复制数据,其实,copy方法也可以在一个数组内移动数据。这时的复制行为等效于标准 c/c++ 函数 memmove,而不是 memcpy。
      下面的inserthelper方法从index处开始,将后面的内容往右移count位,右移后超出数组长度的元素被舍弃。同样的,removehelper方法从index+count处开始,将后面的所有元素移动index处,array.length-count后的元素被舍弃。
public static array inserthelper(array array, int index, int count)
{
    array.copy(array, index, array, index+count, array.length-(index+count));
    array.clear(index, count);
}
   
public static array removehelper(array array, int index, int count)
{
    int copy = ;
    array.copy(array, index+count, array, index, array.length - (index+count));
    array.clear(array.length - count, count);
}
       对于不包含任何内部对象引用的值类型数组,buffer类提供了几个有用的方法(blockcopy,bytelength,getbyte,setbyte)来对它们进行操作。在使用这些方法时,元素的类型被忽略,因为buffer类只是将数组看作一系列的字节,不同类型的数组之间可以相互复制。比如我们可以将浮点类型数组复制到整数类型数组,反过来也一样。
在多维数组复制数据时,数组被看成为一个一维数组(长度等于多维数组所有维的长度的总和)。举个例子,如果有一个三维数组,每维有4个元素(array[3,4]),从数组开始复制6个元素,其结果是前4个元素是第一维的所有元素,后2个元素是第二维的前面2个元素。
       另外,值得我们留意的一个类是bitarray,有点pascal的风格。bitarray类是管理位值的压缩数组,该值表示为布尔值,其中 true表示位是打开的(1),false表示位是关闭的(0)。另一个与bitarray相似的是bitvector32结构,该结构以 32 位内存存储布尔值和小整数。对于内部使用的布尔值和小整数,bitvector32 比 bitarray 更有效。bitarray 可以按需要无限地扩大,但它有内存和性能方面的系统开销。相比之下,bitvector32 只使用 32 位。
arraylist视图
       arraylist可以为array和ilist建立视图。
adapter
       使用arraylist.adapter方法可以为任何实现ilist接口的类建立一个视图,使它可以被作为arraylist类来进行操作。换句话说,ilist可以利用arraylist类提供的方法(binarysearch,sort,reverse,getrange,还有转换功能)。对于array数组,这就不显得那么有用了,因为它本身也提供了这些方法(除了提取子集外)。

 

语法

ilist转换成array

arraylist.adapter(ilist).toarray()

反转ilist

arraylist.adapter(ilist).reverse()

取得子集

本文关键:数组 Array ArrayList .net
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top