委託的進一步學習3

                嘿嘿,今天的晚上是平安夜,預祝你們節日快樂!在這個冰冷的冬天,給本身一點溫暖不論怎麼樣,生活中的咱們要心情愉悅哦,下面就來總結一下咱們今天學習的內容,其實咱們今天是學習了委託以及對Linq的初步認識吧,總結一下今天學習的內容吧。學習

          一.Lamda表達式在委託中的使用this

 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出來,而後能夠給委託傳參,在這隻想說委託的方法不必定是靜態的,可是靜態的方法是最方便的。spa

           二.Linq中的where方法code

        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表達式時間須要注意參數的問題,在這裏對於初學者也是容易出錯的地方,嘿嘿。orm

         三.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類型的的返回值。blog

          四.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的說法,看了仍是能夠理解的,就搬遷來寫下啦。在寫完這個方法知道想輸出內容須要使用委託,可是看了一下方法的返回值類型,感受委託就應該也是這樣的返回值類型吧,因而就這樣定義,再返回時間居然是正確的,而後我認爲:若是咱們已經寫好了方法,那麼在僅僅是一個方法的輸出上委託的返回值類型和方法的類型能夠是同樣的。
ip

         五.事件的學習get

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中實現事件那是咱們有已經寫好的方法,而在這裏學習一下自定義的事件,事件是創建在委託之上的,能夠理解爲一個方法的實現則下一個方法也可實現。好啦,仍是好好學習委託以後再來看事件吧,其實仍是很容易理解的。

          今天就寫到這裏,學習的每一天都是一個積累的過程,我會好好的努力積累,可是仍是要好好地複習,嘿嘿。

相關文章
相關標籤/搜索