写在前面:
像这样的看书笔记,既然每次看完一章,自己总结了写博客,就应该在每篇博文前直接将知识点列出来,自己看着也清晰,然后下面总结的语句根据列出来的自由发挥,也算考验自己
- 数组在内存中的存储
- 锯齿数组的使用
- 元组的使用
- 数组支持协变
- 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());