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;
即参数是基类的数组,可以传递派生类的数组
目的:
复制数组元素
如果元素是值类型,复制值
如果元素是引用类型,复制引用
foreach的作用就是迭代集合内的元素
IL不解析foreach,会编译为IEnumerable接口中的方法和属性
IEnumerable中重点使用的是方法GetEnumator
该方法使用yelid语句一行一行的返回,返回一个集合
foreach迭代的时候都需要访问这个集合
所以foreach迭代集合的时候就无需一次性将所有数据放入内存
备注:这是我理得思路,但是5到6,为什么所以呢,我没懂,不过我知道效率并不是我原来想象的那么查
目的:
将一维数组的元素分割处理,分割出来的不是副本,所以分割后的改变对原数组相应改变
使用:
//原数组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
重写接口中的Equals方法,实现比较、查找
使用到的地方:Contains()包含,list的Reamove()方法
你想,集合包含某个元素,删除某个元素,是不是先得判断这个元素是否在这个集合内
使用:
排序
区别:
第一种 在需要排序的类型上写代码
第二种 用其他类来帮助排序的类型上写代码
假如我要A类型数组排序,我用第一种,加入boss说了,那个类的结构不能改变一点,那我就用第二个接口
使用:
像这样的看书笔记,既然每次看完一章,自己总结了写博客,就应该在每篇博文前直接将知识点列出来,自己看着也清晰,然后下面总结的语句根据列出来的自由发挥,也算考验自己
数组在内存中的存储
锯齿数组的使用
元组的使用
数组支持协变
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());
相关文章推荐
- C#_密封类和密封方法
- 在 C# 中实现 Singleton (来源MSDN技术文章)
- c# 委托
- Singleton模式的实现方式 C#
- C#使用私钥进行RSA加密
- 面向对象
- C#控制属性
- C#中的static、readonly与const的比较
- C#的NHibernate的CRUD开发入门代码例子
- C# 字符串转换成日期,两个日期值比较大小,求两个日期相差天数
- 【鸟瞰】C#的学习
- C# WinForm获取当前路径汇总
- c#wpf获取DataGrid值
- C#支付宝移动支付开发详细教程
- 关于C#如何利用QQ邮箱SMTP发送邮件
- c# 根据中文汉字获取到拼音
- C#中的IEnumerable接口深入研究【转】
- c#操作MangoDB 之MangoDB CSharp Driver驱动详解
- c# - Abstract and Interface, virtual and abstract
- MVC4 model 自定义验证笔记