委托的進一步學習3


                嘿嘿,今天的晚上是平安夜,預祝大家節日快樂!在這個冰冷的冬天,給自己一點溫暖不論怎么樣,生活中的我們要心情愉悅哦,下面就來總結一下我們今天學習的內容,其實我們今天是學習了委托以及對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中實現事件那是我們有已經寫好的方法,而在這里學習一下自定義的事件,事件是建立在委托之上的,可以理解為一個方法的實現則下一個方法也可實現。好啦,還是好好學習委托之后再來看事件吧,其實還是很容易理解的。

          今天就寫到這里,學習的每一天都是一個積累的過程,我會好好的努力積累,但是還是要好好地復習,嘿嘿。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM