[Powershell] Powershell中的动态数组

This artical will also be published in English http://www.cnblogs.com/LarryAtCNBlog/p/4252464.html

又或者说是C#? 因为powershell本源就是C#。当然,标题是个伪命题,根据如下MSDN页所述,对于一个array对象来说,IsFixedSize属性一直就是true的。

https://msdn.microsoft.com/en-us/library/system.array.isfixedsize(v=vs.110).aspx

换句说话就是array里的成员对象数量是固定的,在powershell里用如下的方法添加对象后实际上是复制了一份新数组,而打破了原有的地址指向。

$t = 1..2
$r = $t
$r[1] = 9
$t
# $t的输出为1, 9,因为$r和$t实际上指向的同一个数据,类似于指针
######
$r += 10
$t
# $t的输出依然会是1, 9,因为后台C#所做的实际上是复制了一份原有数组加入新的值后赋给了$r

这种数组添加方式真心简单到爆,但是对资源的开销大了不少,不过脚本嘛就要有脚本的样子,简单易用才是正道。

但是如上面代码里所说,这种方法虽然简单但是却打破了原本$r和$t指向同一个数组的事实,原本我只需要改动$t或$r任一个里的元素值,另一个也会跟着变化,但是这种添加元素的方法却clone了一个新数组使得$t和$r指向了不同的指针。

有的时候真得非常需要两个变量指向同一个数组指针一起更新数据,比如线程间的通信,但是元素数量的改动又是必须的,理所当然,会想到array本身可能有方法做这这个吧?事实是有,也同时没有。看如下数组和对象的静态方法,

Remove         Method                void IList.Remove(System.Object value)
RemoveAt       Method                void IList.RemoveAt(int index)
# 当使用remove和removeAt的时候会报错说这个collection是fixed size的
Clear             Method     static void Clear(array array, int index, int length)
# 当使用[array]::clear($t, 1, 1)的时候的确可以清空最后一个元素的值,但是数组的成员数量依然不会改变

我想要的只是多个变量指向同一个数组且我能改变数组的成员数量并不影响前一条。

我之前一直关注在array对象上,想着会不会有什么wonderful方法能直接实现我所想的,事实证明是错误的。于是我转向了IsFixedSize这个属性,想找一找有没有其它对象足够像array但是这个IsFixedSize属性却可以是false的,于是找到了ArrayList

https://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=vs.110).aspx

$t = New-Object System.Collections.ArrayList
$t.IsFixedSize
# 输出为false

很好,第一步实现了,它是动态的,调用元素的方法也和普通array一样。它填充元素的方法类似于hash table,感觉十分友好。

Add            Method                int Add(System.Object value), int IList.Add(System.Object v...
AddRange       Method                void AddRange(System.Collections.ICollection c)
Remove         Method                void Remove(System.Object obj), void IList.Remove(System.Ob...
RemoveAt       Method                void RemoveAt(int index), void IList.RemoveAt(int index)
RemoveRange    Method                void RemoveRange(int index, int count)
TrimToSize     Method                void TrimToSize()
Capacity       Property              int Capacity {get;set;}
Count          Property              int Count {get;}

Add是增加单个元素在数组的最后,AddRange则是把另一个Collection的对象复制到它的最后面,这就解决了元素增加的问题。

Remove* 的3个方法则是在数组中删掉相应的元素,这解决了元素减少的问题。

Count和Capacity属性会随着元素增加而增长,但Capacity不会随着元素减少而自减,Count属性则会,这解决了元素Get and Set的问题。

TrimToSize也就是Align count和Capacity属性,把该数组的capacity置于和count一样。

至此,我之前想要的"多个变量指向同一个数组且我能改变数组的成员数量并不影响前一条"已经实现~~

那么这种对象实现起来这么容易,开销呢?

无论从内存或者说是cpu来说开销自然也是大不少的,最简单的测试就是开俩powershell分别用这两种办法建一个大数组如1..1000000,然后就能从内存中看出明显的占用区别,至于CPU时间太短直观的感觉不容易发现罢了。简单易用的后台是Powershell或者说C#在帮我们处理而已,当然,之前提及过,脚本就要有脚本的样子,自动化才是关注的重点~~

时间: 2024-10-03 09:48:15

[Powershell] Powershell中的动态数组的相关文章

C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

目录 00 简介 01 算法概述 02 公用方法 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存的忙闲状态,为进程分配和释放内存.当主存的空间太小而无法装入所有的进程时,就需要在内存和硬盘之间进行调度操作. 多数操作系统只采用某种特定的页面置换算法进行置换,无法预先探测当前运行进程的页面访问模式,因此不能根据不同的页面访问模式,选用不同的页面置换算法.当然,如果能对不同的访问模式选取相应的页面置换算法,

关于C#中的动态数组ArrayList

在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 二.ArrayList类与Array类的区别 ArrayList类实际上是Array类的优化版本. ArrayList只能定义一维数组,Arrays可以定义多维数组. ArrayList的下限始终为0,Array可以定义自己的下限. ArrayList的元素都是object类型的,因此需要进行装箱和拆箱操作,内存分配的代价很高,而Array的元素通常是特定类型的.

[C] 在 C 语言编程中实现动态数组对象

对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态数组. /* Author: [email protected] */ 基本的 C 数组 C 语言编程中声明一个基本数组如下: int main() { // 声明一个容纳 3000 个整数的数组 int my_array[3000]; } 以上代码做了两件事: ● 在栈区开辟内存空间.准确说来是在

关于delphi XE7中的动态数组和并行编程(第一部分)

本文引自:http://www.danieleteti.it/category/embarcadero/delphi-xe7-embarcadero/ 并行编程库是delphi XE7中引进的最受期待的功能之一.下面是一个简单的并行编程例子:   procedure TFormThreading.Button1Click(Sender: TObject); var   tasks: array of ITask;   value: Integer; begin   value := 0;   t

asp中的动态数组

<% Dim array1(),i ReDim array1(3)array1(3)=10response.Write(array1(3)&"<br>")i=15ReDim array1(i)Response.Write(UBound(array1))%>

cpp中vector动态数组(一种container)的简单用法

vector<int> num; for (int i=0; i<10; ++i)num.push_back(i); num.push_back(10); num.push_back(10); cout << "Original array:\n"; //vector<int>::iterator it; //C++11之前用的,11之后可以用auto for (auto it=num.begin(); it!=num.end(); ++it)

C++Builder 中动态数组的使用(转)

源:http://i.cnblogs.com/EditPosts.aspx?opt=1 和AnsiString类型一样,动态数组是为了和DELPHI中的动态数组相兼容而定义,在BCB中,动态数组是用模板(template)的方式使用的,动态数组的定义如下: template class DELPHIRETURN DynamicArray; 所以我们在使用时必须要指定明确的基本数据类型,比如说要定义一个int类型的动态数组arrayOfInt,其定义格式如下: DynamicArray array

[VBS]脚本中的字典、动态数组、队列和堆栈

今天用VBS脚本写了几个程序,用到了字典(Dictionary).动态数组(ArrayList).队列(Queue)和堆栈(Stack).现在写篇Blog总结一下 :-) 1.编写环境 今天突发奇想下载了个gVim来写VBS脚本,我用的版本是7.4的 在写脚本前,需要在gVim的安装根目录下,找到文件“_vimrc”,在里面添加下面三行: set number set softtabstop=4 set tabstop=4 意思分别是“显示行号”.“按退格键一次删掉4个空格”和“设定Tab长度为

C#动态数组ArrayList和List&lt;T&gt;的比较

C#中一维动态数组(即列表)分ArrayList和List<T>两种,其容量可随着我们的需要自动进行扩充 一.ArrayList类(少用) ArrayList位于System.Collections命名空间中,所以我们在使用时,需要导入此命名空间 ArrayList里边的数据类型是object,它类似于向量,可以存储不同的数据类型在一个数组里边(转换为了object) 下面是ArrayList的声明: ArrayList list = new ArrayList(); //声明一个ArrayL