声明数组

int[] myArray;

初始化数组

myArray = new int[4];

数组是引用类型当初始化完毕后,将在托管堆上分配内存空间,其结构图如下

声明和初始化放在一起

int[] myArray = new int[4]

int[] myArray = new int[4] {4, 7, 11, 2};

int[] myArray = new int[] {4, 7, 11, 2};

int[] myArray = {4, 7, 11, 2};

引用类型数组

下面自定义一个person类

public class person

{

  public string firstname{get;set;}

  public string lastname{get;set;}

  public override string ToString()//重写了基类的string类

  {

    return string.fromat("{0},{1}",firstname,lastname);
  }

}

现在定义一个person数组

Person[] myPersons = new Person[2];

对每一个元素进行初始化

myPersons[0] = new Person { FirstName="Ayrton", LastName="Senna" };
myPersons[1] = new Person { FirstName="Michael", LastName="Schumacher" };

也可以这样定义

Person[] myPersons2 =
{
new Person { FirstName="Ayrton", LastName="Senna"},
new Person { FirstName="Michael", LastName="Schumacher"}
};

该数组在内存中的存储结构

多维数组

二维数组

int[,] twodim = new int[3, 3];
twodim[0, 0] = 1

定义兼赋值

int[,] twodim = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

三维数组

int[,,] threedim = {
{ { 1, 2 }, { 3, 4 } },
{ { 5, 6 }, { 7, 8 } },
{ { 9, 10 }, { 11, 12 } }
};

锯齿数组

int[][] jagged = new int[3][];
jagged[0] = new int[2] { 1, 2 };
jagged[1] = new int[6] { 3, 4, 5, 6, 7, 8 };
jagged[2] = new int[3] { 9, 10, 11 };

数组类 array class

array是抽象类型不能够new

Array intArray1 = Array.CreateInstance(typeof(int), 5);
for (int i = 0; i < 5; i++)
{
intArray1.SetValue(33, i);
}
for (int i = 0; i < 5; i++)
{
Console.WriteLine(intArray1.GetValue(i));
}

也可以把该数组转换为传统c#定义的int数组

int[] intArray2 = (int[])intArray1;

createInstance有好多重载函数

创二维数组

int[] lengths = { 2, 3 };
            int[] lowerBounds = { 1, 10 };
            Array array2 = Array.CreateInstance(typeof(Person), lengths, lowerBounds);
            array2.SetValue(new Person
            {
                FirstName = "tian",
                LastName = "hello"
            },1,10);

也可以对此数组进行转换

Person[,] racers2 = (Person[,])racers;
Person first = racers2[1, 10];
Person last = racers2[2, 12];

数组的复制

因为数组是引用类型,把数组的名称直接赋给另一个数组其实就是把引用赋给了这个数组他们还是指向同一个数组

如果数组的元素类型是值类型可以通过下面方法进行复制

int[] intArray1 = {1, 2};
int[] intArray2 = (int[])intArray1.Clone();

这两个数组在内存中的存储结构如下

如果数组包括引用类型也只是引用的复制,他们指向的还是同一个对象

Person[] beatles = {
new Person { FirstName="John", LastName="Lennon" },
new Person { FirstName="Paul", LastName="McCartney" }
};
Person[] beatlesClone = (Person[])beatles.Clone();

其中person是自定义的类类型

其在内存中的存储结构如下

clone方法是数组的浅复制,如果想要对包括引用类型的数组进行deep copy,那么就必须遍历数组然后对数组每一项进行创建新对象

数组的比较

public class Person : IComparable<Person>
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public override string ToString()
        {
            return String.Format("{0} {1}", FirstName, LastName);
        }

public int CompareTo(Person other)
        {
            if (other == null) return 1;
            int result = string.Compare(this.FirstName, other.FirstName);
            if (result == 0)
            {
                result = string.Compare(this.LastName, other.LastName);
            }
            return result;
        }
    }

被比较数组的元素必须要实现icomparable接口

static void Main(string[] args)
        {
            Person[] persons =
            {
                new Person{FirstName = "Damon",LastName = "Hill"},
                new Person{FirstName = "Niki",LastName = "Lauda"},
                new Person{FirstName = "Ayrton" ,LastName ="Senna"},
               new Person{FirstName = "Graham",LastName = "Hill"}
            };
            Array.Sort(persons);
            foreach(var pr in persons)
            {
                Console.WriteLine(pr);
            }
        }

 元组(tuples)

数组包含是相同类型的元素而元组可以包含不同类型的元素

static void Main(string[] args)
        {
            var result = Divide(5, 2);
            Console.WriteLine("result of division:{0},remender:{1}", result.Item1, result.Item2);
            var tuple = Tuple.Create<string, string, string, int, int, int,double, Tuple<int, int>>("tian", "mo", "chou", 4, 5, 6, 2.3,Tuple.Create<int, int>(20, 20));
            ;
        }
        public static Tuple<int,int> Divide(int dividend,int divisor)
        {
            int result = dividend / divisor;
            int reminder = dividend % divisor;
            return Tuple.Create<int, int>(result, reminder);
        }

C#数组和元组的更多相关文章

  1. 小甲鱼:Python学习笔记002_数组_元组_字符串

    创建普通数组 >>> member=["山东黄金","九阳股份"] >>> member ['山东黄金', '九阳股份'] ...

  2. C#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)

     托管和非托管资源 1.托管资源是指GC管理的内存空间,非托管资源是指文件句柄,网络连接,数据库连接等. 2.方法中临时申请的变量,被存放在栈中.栈存储非对象成员的值数据.例如在方法中有B b=new ...

  3. Scala学习——数组/映射/元组

    [<快学Scala>笔记] 数组 / 映射 / 元组 一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初 ...

  4. Scala详解---------数组、元组、映射

    一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需new关键字 Scala声明数组时,需要带有Arr ...

  5. Scala具体解释---------数组、元组、映射

    一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需newkeyword Scala声明数组时.须要带 ...

  6. TypeScript学习——数组、元组、接口(2)

    数组 数组类型注解 const numberArr: (number | string)[] = [1, '2', 3]; //既可以是number 也可以是string const stringAr ...

  7. Python 数组[],元组(),字典{}的异同

    序列 Python有6中内建的序列,在这里我们重点讨论两种,数组和元组.所有序列都可以做某些特定的操作,大致上常用的是:加,乘,索引,分片以及检查某个元素是否属于序列的成员. Python还提供一些内 ...

  8. C#高级编程笔记 Day 8, 2016年9月 28日 (数组)

    1.数组的初始化 声明了数组后,就必须为数组分配内存,以保存数组的所有元素.数组是引用类型,所以必须给它分配堆上的内存,为此,应使用 new 运算符,指定数组中元素的类型和数量来初始化数组的变量.若使 ...

  9. 浅谈C#数组(二)

    六.枚举集合 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中元素的个数.foreach语句使用一个枚举器.foreach会调用实现了IEnumerable接口的集合类中的Get ...

随机推荐

  1. 在使用cognos时遇到的问题记录帖

    在使用cognos时遇到的问题记录帖 1.开一个project 报无法访问位于 URL 的服务: http://localhost:80/ibmcognos/cgi-bin/cognos.cgi?b_ ...

  2. google的作恶与不作恶

    Google刚刚出现时,那时互联网还似桃花源,路不拾遗夜不闭户,最多升级升级病毒库.Google的发展,从商业模式上带来了广告对互联网无孔不入的渗透,如今Google.百度.阿里等各大巨头都有自己的广 ...

  3. winServer2008添加IIS服务

    右键我的电脑,选择管理,打开服务器管理器 点击左边菜单栏角色调出角色窗口 接着点击添加角色,弹出添加角色向导 点击下一步进入服务器角色选项 勾选Web服务器(IIS),点击下一步 出现 点击下一步,出 ...

  4. 著名清理软件(CCleaner) 5.24.5841 中文版

    软件名称: 著名清理软件(CCleaner) 软件语言: 多国语言 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 5.7MB 图片预览: 软件简介: CCleaner的体积小, ...

  5. Thrift学习记录

    Thrift学习记录 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Python,PHP,Ruby,Erlang, ...

  6. Python学习笔记——基础篇【第七周】———类的静态方法 类方法及属性

    新式类和经典类的区别 python2.7 新式类——广度优先 经典类——深度优先 python3.0 新式类——广度优先 经典类——广度优先 广度优先才是正常的思维,所以python 3.0中已经修复 ...

  7. [Q]无法卸载怎么办

    正确卸载CAD批量打图精灵的方法是进入操作系统,“控制面版”,然后运行“添加和删除程序”,找到CAD批量打图精灵,选“更改/删除”,按照提示操作,即可进行卸载. 若使用强制卸载工具(如360等)卸载可 ...

  8. C#+ArcEngine中com对象的释放问题

    1.问题描述 最近在写C#下AE的开发,在循环获取数据并修改时碰到了两个问题"超出系统资源"和"超出打开游标最大数":在网上看了一些资料,发现都是说在循环中没有 ...

  9. CCF-出现次数最多的数

    试题名称: 出现次数最多的数 试题编号:201312-1 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一 ...

  10. 7、Objective-C中的各种遍历(迭代)方式

    一.使用for循环 要遍历字典.数组或者是集合,for循环是最简单也用的比较多的方法,示例如下: //普通的for循环遍历 -(void)iteratorWithFor { //////////处理数 ...