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

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

  1. 数组在内存中的存储
  2. 锯齿数组的使用
  3. 元组的使用
  4. 数组支持协变
  5. Clone方法
  6. foreach的实现原理
  7. 使用ArraySegment< T>接口
  8. 使用IComparable< T>与IComparer< T>接口
  9. 使用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实现原理

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

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

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

  3. IEnumerable中重点使用的是方法GetEnumator

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

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

  6. 所以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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值