首页 > 技术文章 > 委托的进一步学习3

dyxd 2014-12-24 23:11 原文

                嘿嘿,今天的晚上是平安夜,预祝大家节日快乐!在这个冰冷的冬天,给自己一点温暖不论怎么样,生活中的我们要心情愉悦哦,下面就来总结一下我们今天学习的内容,其实我们今天是学习了委托以及对Linq的初步认识吧,总结一下今天学习的内容吧。

          一.Lamda表达式在委托中的使用

 delegate string MyDel(string n,string p);
    public class Program
    {   
        static void Main(string[] args)
        {
            #region Lamda表达式
            #region Func linq
            //List<string> list = new List<string>() { "张三", "李四", "王五", "赵六", "马七", "李四" };   //定义一个集合
            //Func<string, bool> f = v1 => v1 == "李四";       //Func是一种委托,这是在3.5里面新增的  
            //Console.WriteLine(list.First());           //First与FirstOrDefault其实一样吧,但是集合中的值为空时间抛异常,所以我们可以选择
            //Console.WriteLine(list.FirstOrDefault(f));          //输出第一条数据
            //Console.WriteLine(list.Last());        //Last与LastOrDefault的情况同上
            //Console.WriteLine(list.LastOrDefault(f));           //输出最后一天数据
            #endregion
            //Func<string, bool> f1 = fu => fu == "张三";
            //Console.WriteLine(list.Where(f1).SingleOrDefault());   //在这里是查找条件,因此我们设置的条件在集合中仅有一个
            //Console.ReadKey();
            #endregion
            #region 匿名方法
            //MyDel del = delegate(string name, string pwd)
            //{
            //    return string.Format("姓名:" + name, "密码:" + pwd);       //在这里利用委托定义啦一个匿名的方法
            //};
            //del = (string name, string pwd) => { return string.Format("姓名:" + name, "密码:" + pwd); };
            //del = (name, pwd) => { return string.Format("姓名:" + name, "密码:" + pwd); };
            #endregion
            #region 多播委托
            //MyDel del = Say;
            //del += SayHi;
            //Console.WriteLine(del("张三", "123"));
            #endregion
            Console.ReadKey();
        }
        static string SayHi(string name, string pwd)
        {
            string format = string.Format(name+"/n"+pwd);
            return format;
        }
        static string Say(string name, string pwd)
        {
            string format = string.Format(name + "\n" + pwd);
            return format;
        }
    }

 

                在这里写的几个方法主要有使用Func委托的使用中,在定义条件时间使用了Lambda表达式,我们也学会使用Lambda表达式,以及委托的方法First以及FirstOrDefault;在匿名方法中我们一般还是知识了怎样去写方法,目前还不知道它的用途以及怎样才有意义,在这里我看起来并没有什么意义吧;多播委托,在使用多播委托时间需要注意的是输出的方法只是最后一个,还有就是如果写的方法不是静态的方法,那么就需要先实例化new出来,然后可以给委托传参,在这只想说委托的方法不一定是静态的,但是静态的方法是最方便的。

           二.Linq中的where方法

        static void Main(string[] args)
        {
            //linq
            List<string> list = new List<string> { "张三", "李四", "王五", "赵六" };
            Func<string,bool>  func = f => f == "张三";
            IEnumerable<string> able=  list.Where(func);
            IEnumerable<string> ab = list.Where(f=>f=="张三");
            Console.WriteLine(ab.SingleOrDefault());
            Console.WriteLine(able.SingleOrDefault());
            Console.ReadKey();
        }

 

              在这里是简单的写了where方法,在使用Lambda表达式时间需要注意参数的问题,在这里对于初学者也是容易出错的地方,嘿嘿。

         三.Linq中的其他方法

        static void Main(string[] args)
        {
            List<string> list = new List<string>() { "张三", "李四", "王五", "赵六", "李四", "李四" };
            Func<string, bool> func = func1 => func1 == "张三";
            IEnumerable<string> able = list.Where(func);      //通过条件查询,查询出符合条件的
            Console.WriteLine(able.SingleOrDefault());

            IEnumerable<bool> abl = list.Select(func);   //遍历集合中的每一项,判断是否为Select方法中的值,如果是则返回true, 
            foreach (var item in abl)                   //否则返回false,在返回值类型上面学要注意,凡获得是一个bool类型的值
            {
                Console.WriteLine(item);
            }

            IEnumerable<string> ab = list.Skip(2);    //打印出集合中的除了前两条的数据信息
            foreach (var item in ab)
            {
                Console.WriteLine(item);
            }

            IEnumerable<string> a = list.Take(3);     
            foreach (var item in a)
            {
                Console.WriteLine(item);
            }
        }

 

                今天还学习了Linq的一些其他方法,这些方法其实看起来还是蛮简单的,但是我们需要自己写一写,这样才能更加记忆幽深,在我写的这几个方法中,我感觉还是select方法出了一个问题,就是返回值类型,其他的方法返回值类型都是一个string类型的集合,但是select返回的是bool类型,那时间我还故认为只针对参数判断true和false,但是在输出时间看了一下结果发现它是遍历出集合中的每一项,对它都做一个判断。所以这个是需要注意的。另外就是返回类型为什么是一个集合?其实这个就需要我们自己观察的,当我们使用集合的对象遍历时间看一下返回类型,它是返回一个IEnumerable类型的的返回值。

          四.yield return的使用

    class Program
    {
        delegate IEnumerable<string> Mydel(string name);
        static void Main(string[] args)
        {
            Mydel del = GetReturn;
            foreach (var item in del("李四"))  
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
        static IEnumerable<string> GetReturn(string name)                //返回值类型为一个集合类型
        {
            List<string> list = new List<string>() { "张三", "李四", "王五", "赵六", "李四" };

            foreach (var item in list)              
            {
                if (item.Equals(name))
                {
                    yield return item;         
                }
            }
        }
    }

 

              之前学习了迭代器,知道了它,但是并不是很熟悉,其实yield 关键字,则意味着它在其中出现的方法、运算符或 get 访问器是迭代器。 通过使用 yield 定义迭代器,可在实现自定义集合类型的 IEnumerable 和 IEnumerator 模式时无需其他显式类(保留枚举状态的类)。这个是来自msdn的说法,看了还是可以理解的,就搬迁来写下啦。在写完这个方法知道想输出内容需要使用委托,但是看了一下方法的返回值类型,感觉委托就应该也是这样的返回值类型吧,于是就这样定义,再返回时间竟然是正确的,然后我认为:如果我们已经写好了方法,那么在仅仅是一个方法的输出上委托的返回值类型和方法的类型可以是一样的。

         五.事件的学习

public delegate void Mydel(object sender, EventArgs e);
    public class Cat
    {
        public string Name { set; get;}
        public int Age { set; get; }
        public event Mydel Run;
        public void SayHi()
        {
            Console.WriteLine("我是一只小猫喵喵喵");
            Args e = new Args();
            e.Name = Name;
            if (Run != null)
            {
                Run(this,e);
            }
        }
    }
public class Mouse
    {
        public void MouseRun(object sender,EventArgs e)
        {
            Args args = e as Args;
            Console.WriteLine("{0}来了,大家快跑啊!", args.Name);
        }
    }
public class Args:EventArgs
    {
        string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Cat c = new Cat();
            c.Name = "大脸猫";
            Mouse m = new Mouse();
            c.Run += m.MouseRun;
            c.SayHi();
            Console.ReadKey();
        }
    }

 

               前段时间一直在写winform窗体程序,感觉实现一个事件是再简单不过的事情,我们对控件简单的单击即可实现它的单击事件,但是我们在winform中实现事件那是我们有已经写好的方法,而在这里学习一下自定义的事件,事件是建立在委托之上的,可以理解为一个方法的实现则下一个方法也可实现。好啦,还是好好学习委托之后再来看事件吧,其实还是很容易理解的。

          今天就写到这里,学习的每一天都是一个积累的过程,我会好好的努力积累,但是还是要好好地复习,嘿嘿。

 

推荐阅读