c#第十九课

104 阅读2分钟

委托

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate)  是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

    委托声明语法:delegate <return type> <delegate-name> <parameter list>

一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。

delegate void Delegate1(int i);//定义一个委托,无函数体,相当于变量
 public void test(int i)
 {
     Console.WriteLine("加热"); 
 }
Delegate1 myDelegate = test;
myDelegate(3);

myDelegate += test1;//通过相加可以添加  多一个函数,调用时同时调用
myDelegate -= test1;//通过相减可以去掉一个函数,调用时就没有该函数
myDelegate(34);
myDelegate.Invoke(22);//委托另一种调用方式


事件

事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。

在类的内部声明事件,首先必须声明该事件的委托类型
public delegate void Heat(int i);

// 基于上面的委托定义事件
public event Action<int> Heat;

 public void heating()
 {
     //Heat = test;//给事件赋值
     Heat(2);
 }
//事件不能在类外面赋值  但可以加减 也不能调用      
heater.Heat += test1;
heater.heating();

排序

插入排序:原理 将数组中的数分为左边排序区和右边的未排序区,每次拿未排序中的第一个值和排序区中的值进行对比,如果比排序区中的值大则交换两个的值然后再继续往前判断直到判断到左边的值没有比右边的值大的时候,那么这个位置就是刚才未排序区第一个值在排序区中的位置,接下来继续判断下一个未排序区的值一次类推直到最后一个值

//插入排序:排序区,从第一个元素开始,未排序区
int[] newArray = new int[] { 4, 7, 11, 10, 1, 0 };
int temp;
//从排序区第一个元素开始遍历,每一次确定一个未排序区中的值,找到他它排序区中合适的位置插入
for (int i = 1; i < newArray.Length; i++)//i从1即数组第二个元素开
{
    for (int j = i; j > 0; j--)//当前第i个值与排序区中的值对比找到合适的位置  
    {
        if (newArray[j - 1] < newArray[j])//如果前面的值小于后面的值,则位置不变
        {
            break;
        }
        //如果前面的值大于后面的值,则交换位置
        temp = newArray[j];
        newArray[j] = newArray[j - 1];
        newArray[j - 1] = temp;
    }
}
Console.WriteLine(String.Join(" ", newArray));//0 1 4 7 10 11

//希尔排序
插入排序的升级版
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。  
然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
int[] newArray = new int[] { 4, 7, 11, 10, 1, 0 };
int temp = newArray[0];
for (int step = newArray.Length / 2; step >= 1; step /= 2)// 步长的变化
{
    for (int start = step; start < newArray.Length; start++)//每一轮进行/每一轮进行步长为step的插入排序
    {
        for (int s = start; s >= step; s -= step)
        {
            if (newArray[s] < newArray[s - step])//左边的值大于右边就交换次序
            {
                temp = newArray[s];
                newArray[s] = newArray[s - step];
                newArray[s - step] = temp;
  
        }
    }
}
Console.WriteLine(String.Join(" ", newArray));//0 1 4 7 10 11
//快速排序
int[] newArray = new int[] { 4, 7, 11, 10, 1, 0 };
int start = 0;//开始游标
int end = newArray.Length - 1;//结束游标
void getMiddle(int s, int e)
{
    int start = s;
    int end = e;
    int mid = newArray[start];
    if (s == e || s > e) return;
    while (end > start)
    {
        //从最右边开始
        while (newArray[end] >= mid && start < end)
        {
            end--;
        }
        newArray[start] = newArray[end];
        while (newArray[start] <= mid && start < end)
        {
            start++;
        }
        newArray[end] = newArray[start];
    }
    newArray[end] = mid;
    getMiddle(s, end - 1);
    getMiddle(end + 1, e);
}
getMiddle(start, end);
Console.WriteLine(String.Join(" ", newArray));