夜光序言:
所有路上的艰辛,都只有自己知道。所有路过的快乐,也只有自己明了。
正文:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 案例3
{
class Stu /*: IComparable*/
{
//我们先定义两个属性
public int id;
public string name;
public override string ToString()
{
return string.Format("id={0},name={1}", id, name);
}
}
//夜光:如果我们自己写一个顺序表,能否实现跟list.sort一样的功能(按照delegate指定的方法来进行排序)
class StuMgr
{
private Stu[] stuList = new Stu[111];
private int n = 0;
public void Add(Stu stu)
{
if (n >= stuList.Length)
throw new InvalidOperationException("数组异常");
stuList[n] = stu;
n++;
}
//夜光:我们定义一个排序的方法
public void Sort()
{
//最简单的冒泡排序
for(int i = 0; i < n - 1; i++)
{
for(int j = i + 1; j < n; j++)
{
if(stuList[i].id > stuList[j].id)
{
Stu tmp = stuList[i];
stuList[i] = stuList[j];
stuList[j] = tmp;
}
}
}
}
// 划重点,下面
// 如果返回值大于0,则表示s1在s2前面,反之亦然
public delegate int CompareDelegate(Stu s1, Stu s2);//这样,我们的代理声名就结束了
public void Sort(CompareDelegate cd) //cd,取首字母
{
//最简单的冒泡排序
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
/*if (stuList[i].id > stuList[j].id)*/
if(cd(stuList[i],stuList[j]) > 0) //如果大于0的话,则说明i在j前面
{
Stu tmp = stuList[i];
stuList[i] = stuList[j];
stuList[j] = tmp;
}
}
}
}
public void Print()
{
for(int i = 0; i < n; i++)
{
Console.WriteLine(stuList[i]);
}
}
}
class Program
{
//下面这个:代理定义了一个方法的原型
//返回值必须是int,有两个参数 x<y
// 表示x在前 , x == y 两者在同一位置, x>y 表示y在前
/*public delegate int Comparison<in T>(T x, T y);*/
//代理如何改为具体的方法
//1.去掉delegate关键字 并且增加static关键字
//2.把T类型变成实际要比较的类型
//3.实现代理的方法体,按照文档的规范要求
public static int CompareById(Stu x, Stu y) //定义一个方法
{
return x.id - y.id; //如果是大于0的,表示x在前,如果小于0,表示y在前
}
//下面一个实现按照name的比较
public static int CompareByName(Stu x, Stu y) //定义一个方法
{
return x.name.CompareTo(y.name); //根据name来进行排序
}
static void Main(string[] args)
{
Stu s1 = new Stu() { id = 5, name = "萧炎" };
Stu s2 = new Stu() { id = 2, name = "林动" };
Stu s3 = new Stu() { id = 8, name = "唐三" };
//夜光:我们创建一个list
#region delegate 的创建
//首先new一个学生管理器出来
StuMgr sm = new StuMgr();
sm.Add(s1);
sm.Add(s2);
sm.Add(s3);
//排序的规则引用
sm.Sort();
sm.Sort(CompareById); //需要给这两个方法进行重载
/*sm.Sort(CompareByName);*/
sm.Print();
#endregion
#region delegate 的使用
/* List<Stu> sa = new List<Stu>();
sa.Add(s1);
sa.Add(s2);
sa.Add(s3); //我们把元素,三个加入进去
//下面这个,要传入进去方法的名称
*//*sa.Sort(CompareByName);*//* //想要使用这个比较器,需要实现接口
//为什么上面会报错,因为这个方法有点问题,需要加入static关键字
switch (Console.ReadKey().Key)
{
case ConsoleKey.D1:
sa.Sort(CompareById);
break;
case ConsoleKey.D2:
sa.Sort(CompareByName);
break;
}
//写一个循环,输出看一下
for (int i = 0; i < sa.Count; i++)
{
Console.WriteLine(sa[i]); //需要重写这个类的方法
}*/
#endregion
Console.ReadLine();
}
}
}