夜光带你走进C# 游戏开发等(九十二)擅长的领域

夜光序言:

 

 如果你总是抓着悲伤不肯放手,那么你永远都不会真正地快乐。

 

 

 

 

 

 

 

 

正文:

lambda表达式:更简单的使用代理

 

 

 

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 = 9, 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();


            //lambda表达式用了编译器类型推断
            // 语法格式(参数列表) => {方法体}
            sm.Sort((x, y) =>
            {
                //写方法体
                return x.id - y.id; //如果是大于0的,表示x在前,如果小于0,表示y在前
            });

            /*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();
        }
    }
}

 

 

 

看了上面的介绍,千万不要混淆,记住代理里面存放一个对象,这个对象是一个方法

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值