您的位置:首页 > 编程语言 > C#

pp看书笔记---C#高级编程第九版 第六章 【数组】

2015-12-16 18:42 423 查看
写在前面:

像这样的看书笔记,既然每次看完一章,自己总结了写博客,就应该在每篇博文前直接将知识点列出来,自己看着也清晰,然后下面总结的语句根据列出来的自由发挥,也算考验自己

数组在内存中的存储

锯齿数组的使用

元组的使用

数组支持协变

Clone方法

foreach的实现原理

使用ArraySegment< T>接口

使用IComparable< T>与IComparer< T>接口

使用IEquatable< T>接口

数组在内存中的存储



锯齿数组



介绍:

这个二维数组每一行元素个数都不同,即为锯齿

使用:

int[][] intArray =new int[3][];

intArray[0] = new int[4];

intArray[1] = new int[2];

intArray[2] = new int[3];- - - - - -即构建如图的锯齿数组

元组



目的:

关键字:Tuple

可以最多容纳8个不同类型的数组

使用:

Tuple<< int, string> tup = new Tuple<< int, string>(5,”A”);

var num1 = tup.Item1;

var num2 = tup.Item.2;

支持协变

上一章中咱说过,协变就是兼容的参数

即参数是基类的数组,可以传递派生类的数组

Clone()方法

解释是浅表副本

目的:

复制数组元素

如果元素是值类型,复制值

如果元素是引用类型,复制引用

foreach实现原理

这个我就分一条一条来说思路也清晰点

foreach的作用就是迭代集合内的元素

IL不解析foreach,会编译为IEnumerable接口中的方法和属性

IEnumerable中重点使用的是方法GetEnumator

该方法使用yelid语句一行一行的返回,返回一个集合

foreach迭代的时候都需要访问这个集合

所以foreach迭代集合的时候就无需一次性将所有数据放入内存

备注:这是我理得思路,但是5到6,为什么所以呢,我没懂,不过我知道效率并不是我原来想象的那么查

ArraySegment<< T>



目的:

将一维数组的元素分割处理,分割出来的不是副本,所以分割后的改变对原数组相应改变

使用:

//原数组A

int[] intArray = {0, 1, 2, 3};

//分割数组B

ArraySegment< int> bArray = new ArraySegment< int> (intArray, 0, 2);//原数组,分割位置,分割个数

//修改数组B

bArray[0] = 1;

//数组A中为 1,1,2,3

IEquable< T>

目的:

重写接口中的Equals方法,实现比较、查找

使用到的地方:Contains()包含,list的Reamove()方法

你想,集合包含某个元素,删除某个元素,是不是先得判断这个元素是否在这个集合内

使用:

class Person : IEquable<Person>
{
pubilc int Age{get;set;}

public bool Equals(Person other)
{
return Age == other.Age;
}
}

//使用
Person p1 = new Person(){Age = 18};
Person[] pArray = {……};
//想知道集合中是否有p1
pArray.Equals(p1);
//你断点的时候会看到他没有进入我们重写的Equals中,但确实起作用了,不信你可以在里面加个打印

//想显示的进入在重写一个即可
public override bool Equals(object obj)
{
return Equals(obj as Person)
}


IComparble< T> 与 IComparer< T>

目的:

排序

区别:

第一种 在需要排序的类型上写代码

第二种 用其他类来帮助排序的类型上写代码

假如我要A类型数组排序,我用第一种,加入boss说了,那个类的结构不能改变一点,那我就用第二个接口

使用:

//IComparble< T>接口的使用

//定义结构
class Person : IComparable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person other)
{
//名字的字母从a-z排
return string.Compare(Name, other.Name);
//名字的字母从z-a排
return string.Compare(other.Name, Name);
//年龄从大到小排
return  other.Age - Age;
//年龄从小到大排
return  Age - other.Age;
}
}

//测试数据
Person[] people = new Person[]
{
new Person(){ Name = "Apple", Age = 18 },
new Person(){ Name = "Banane", Age = 15 },
new Person(){ Name = "Cable", Age = 10 },
};
//排序
Array.Soft(people);


//IComparer< T>接口的使用

//定义另一个结构
class CustormSort : IComparer<Person>
{
public int Compare(Personx, Persony)
{
return string.Compare(x.Name, y.Name);
return string.Compare(y.Name, x.Name);
return x.Age - y.Age;
return y.Age - x.Age;
}
}
//排序
Array.Soft(people, new CustormSort());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: