`

数 组

    博客分类:
  • CLR
 
阅读更多

所有数组类型都隐式地从System.Array抽象类派生,后者又派生自System.Object。这意味着数组是在托管堆上进行分配的。

对于0基数组,Microsoft花了大量的时间来优化它们的性能,而且0基数组符合CLS(公共语言规范here),所以它将支持跨语言移植,如可用C#创建一个数组,然后将该数组的引用传给另一种语言写的代码。

从上图中可以看到,每个数组都关联了一些额外的开销信息(Overhead),在这些信息中包括数组的维数、数组的每一维的下限、每一维的长度、数组的元素类型。

 

数组初始化器:

string[] names = new string[]{"bill","gates"};

大括号和其中的以逗号分隔的数据项称为数组初始化器。每个数据项都可以是一个任意复杂度的表达式;在多维数组的情况下,则可以是一个嵌套的数组初始化器。在上例中,我只是使用了两个简单的string表达式。

利用C#的隐式类型的局部变量功能:

var names = new string[]{"bill","gates"};

利用C#的隐式类型的局部变量功能和隐式类型的数组功能:

var names = new[]{"bill","gates",null};

更简单的初始化数组的方法:

string[] names = {"bill","gates"};

 

Array.Copy(源数组,目标数组,要拷贝的元素个数)

它是一个浅拷贝,换句话说,如果数组元素是值类型或字符串类型的话,相当于深拷贝,无论是对源数组还是对目标数组进行操作,他们不会彼此受影响。 如果数组元素是引用类型的话,无论是对源数组还是对目标数组进行操作,他们之间是相互影响的,相当于只拷贝了引用类型的引用。

 

namespace WebApplication1
{
    public class people
    {
        public string name;
    }
    public partial class ArrayCopy : System.Web.UI.Page
    {
        int[] int1 = { 1, 2, 3, 4, 5, 6 };
        int[] int2 = new int[6];
        people[] people1 = new people[2];
        people[] people2 = new people[2];
        protected void Page_Load(object sender, EventArgs e)
        {
            Array.Copy(int1, int2, int1.Length);
            foreach (var item in int1)
            {
                Label1.Text += item.ToString();  //123456
            }
            people p1 = new people();
            people p2 = new people();
            p1.name = "A";
            p2.name = "B";
            people1[0] = p1;
            people1[1] = p2;
            Array.Copy(people1, people2, people1.Length);
            foreach (var item in people1)
            {
                Label4.Text += item.name;  //AB
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            int2[0] = 2;
            int2[1] = 3;
            int2[2] = 4;
            int2[3] = 5;
            int2[4] = 6;
            int2[5] = 7;
            foreach (var item in int1)
            {
                Label2.Text += item.ToString();  //123456
            }
            foreach (var item in int2)
            {
                Label3.Text += item.ToString(); //234567
            }
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            people2[0].name = "B";
            people2[1].name = "A";
            foreach (var item in people1)
            {
                Label5.Text += item.name;  //BA
            }
            foreach (var item in people2)
            {
                Label6.Text += item.name; //BA
            }
        }
    }
}

 

所有数组都隐式派生自System.Array

如果声明一下数组:

string[] strs;

CLR会自动为AppDomain自动创建一个string[]类型。这个类型隐式派生自System.Array,因此,System.Array类型定义的所有实例方法和属性都将由string[]继承,这些方法和属性都能由strs变量调用。比如:Clone、CopyTo、GetLowerBound、Length、Rank等。

System.Array开有许多用于处理数组的静态方法,这些方法均获取一个数组引用作为参数。比如:AsReadOnly、BinarySearch、Clear、ConstrainedCopy、ConvertAll、Copy、Exists、Find、FindAll、FindIndex、FindLast、FindLastIndex、ForEach、IndexOf、LastIndexOf、Resize、Reverse、Sort、TrueForAll等。

 

所有数组都隐式实现IEnumerable、ICollection、IList

许多方法都能操作各种集合对象,因为在声明它们时使用了IEnumerable、ICollection、IList等参数。由于System.Array也实现了这三个接口,所以可以将数组传给这些方法。

这里要提到的一点是由于涉及到多维数组及非0基数组的原因,System.Array并没有实现IEnumerable<T>、ICollection<T>、IList<T>这些泛型类,但

当声明 一维0基引用类型数组 时,CLR会自动使该数组实现IEnumerable<T>、ICollection<T>、IList<T>这些泛型类,并且还会为该引用类型的所有父类数组都实现这些泛型类

而声明 一维0基值类型数组 时,CLR只会自动使该数组实现IEnumerable<T>、ICollection<T>、IList<T>这些泛型类,而不会为该值类型的所有父类数组都实现这些泛型类

 

创建非0基数组

可以通过 Array.CreatInstance(数组元素类型,每一维的元素个数,每一维的下限) 来创建下限非0的数组。如果数组的维数是2或2个以上,则可以使用像普通数组一样方来访问或设置数组元素,如果数组只有一维,C#中只能通过Array的GetValue和SetValue来访问数组元素,而不能通过强制转换的方式把Array转换成一维数组。

 

 //下限是20长度是2的一维数组
protected void Button3_Click(object sender, EventArgs e)
        {
          Array a= Array.CreateInstance(typeof(int), new int[] { 2 }, new int[] { 20 });
          a.SetValue(1, 20);
          a.SetValue(2, 21);
          foreach (var item in a)
          {
              Label7.Text += item.ToString(); 
          }
          Label7.Text += a.GetValue(20);   //121
        }
//第一维下限是4长度是2第二维下限是5长度是3的二维数组
        protected void Button4_Click(object sender, EventArgs e)
        {
            int[,] a = (int[,])Array.CreateInstance(typeof(int), new int[] { 2, 3 }, new int[] { 4, 5 });
            a[4, 5] = 20;
            a[4, 6] = 21;
            a[4, 7] = 22;
            a[5, 5] = 23;
            a[5, 6] = 24;
            a[5, 7] = 25;
            foreach (var item in a)
            {
                Label8.Text += item.ToString();
            }
            Label8.Text += a[5, 5].ToString();   //20212223242523
        }
 

多维数组与交错数组,lookhere

分享到:
评论

相关推荐

    1.给出一个整数数组,求其中任意两个元素之差的最大值。

    根据给定文件的信息,我们可以将相关的知识点分为两个部分来详细阐述: ...以上就是从给定的文件中提取的相关知识点,包括了求解整数数组中任意两个元素之差的最大值以及求解整数数组中出现次数最多的数的详细解答。

    三行三列数组

    三行三列数组

    易语言分割数字文本到整数数组模块

    易语言模块:直接把数字文本分割到整数数组 例如: 待分割文本为: a="1|2|3|4|5" 结果: a={1,2,3,4,5} 省去了把分割好的文本再转换为整数的这一步

    php 将print_r处理后的数据还原为原始数组的方法

    如果变量是string,integer或float,将打印变量值本身,如果变量是array,将会按照一定格式...php原生没有把print_r方法打印后的数据还原为原始数组,因此写了下面这个方法,实现将print_r处理后的数据还原为原始数组。

    sqlserver 分解数组

    分解数组的sqlserver的t-sql语句

    python 实现给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)

    # 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 # 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 # 示例 1: # 输入:nums = [1,2,3] # 输出:[[],[1],[2],[1...

    求整数数组内元素和的分治算法

    求整数数组内元素和的分治算法,用c++语言实现

    易语言字节集数组, 存取字节集/传参数/方便网络传输/DLL交换

    写cs程序最讨厌的就是, 分割字节集/ 于是希望把字节集数组保存和还原. 用于网络传输. 效果不错. 感谢 小路, kyozy的帮助/ 。 字节集内存结构: { 成员数量+0, 成员1长度+4, 成员2长度+8, 完整字节集+12 }。 02:...

    盛最多水的容器 给定一个长度为 n 的整数数组 height

    给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 ...

    升序排列数组、求水仙花数

    在编程领域,"升序排列数组"和"求水仙花数"是两个常见的概念,它们涉及到了数据处理和算法的基础知识。让我们分别探讨这两个主题。 首先,升序排列数组是指将一个数组中的元素按照从小到大的顺序进行排列。这是最...

    给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1

    给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 ),满足 array[i] [i + 1]

    易语言取整数数组指针

    在易语言编程中,"取整数数组指针"是一个重要的概念,涉及到内存管理和数据处理。易语言是一种中文编程环境,旨在降低编程门槛,让普通用户也能进行程序开发。在这个主题下,我们将深入探讨易语言如何操作整数数组的...

    取整数数组指针.rar

    "取整数数组指针"这一主题涉及到如何操作和处理存储整数的数组以及如何通过指针来访问这些数组。在易语言这种面向对象的编程语言中,虽然其语法与C/C++有所不同,但核心概念仍然相同。 数组是一种数据结构,可以...

    易语言取整数数组指针源码

    在易语言编程环境中,"取整数数组指针" 是一个常见的操作,它涉及到内存管理和数据处理的概念。易语言作为一款中国本土化的编程语言,旨在降低编程门槛,提供直观的语句和函数来处理各种编程任务。在这个场景下,...

    matlab 矩阵数组数组运算

    matlab 矩阵数组数组运算: 数与数组加减:k+/-A %k加或减A的每个元素 数组乘数组: A.*B %对应元素相乘 数组乘方: A.^k %A的每个元素k次方;k.^A,分别以k为底A的各元素为指数求幂值 数除以数组: k./A和A./k %k...

    C++实现插入排序对整数数组排序

    利用插入排序,对整数数组排序 根据如下插入排序基本思想编程: 一个数显然是有序的,因此规模为1的排序问题能够求解; 如果能够为n-1个数排序,那么当有n个数时,只需先将前n-1个数排好序,再将最后一个数插入...

    冒泡排序-排列数组中数

    排列数组中数,按照大小。 public class Test{ public static void main(String[] args) { int[]a =new int[]{2,4,9,13,10,9}; for(int i=0;i;i++){ for(int j=i+1;j;j++){ if(a[i]&gt;a[j]){ int temp = a...

    常见的勾股数组公式.doc

    文档“常见的勾股数组公式.doc”探讨了勾股数组的不同公式和特性,这些公式用于生成满足勾股定理(a^2 + b^2 = c^2)的整数三元组 (a, b, c)。以下是这些公式的详细说明和相关知识点: **公式一:22nma, mnb2, 22...

    C++编写的TCP服务器端,传输一个整数数组

    自己使用的Tcp服务端,因为工作学习需要学习的,把涉及私人项目的东西都删掉了,只留下一个代码框架,实现的功能是实现TCP客户端和服务器端传输一个数组以及指令。适合有需要的同学学习,也可以直接拿来用。...

Global site tag (gtag.js) - Google Analytics