擴展方法以及LinQ的學習


                我們今天學習的內容其實還是蠻多的,學習了自動屬性,擴展方法,復習初始化器,以及LinQ的一些方法,其實感覺有些還是很熟悉的,在前面的學習過程中有時間感覺學習的知識知道了怎么使用,但是還沒有在項目中使用,做的習題似乎意義不大,現在依舊如此,感覺僅限於知道怎樣使用。很想做一個小小的項目來熟悉下學習的知識。。。下面就總結下今天學習的內容。

          一.自動屬性

       private int productid;

        public int Productid
        {
            get { return productid; }
            set { productid = value; }
        }
        public string Name { set; get; }

        private decimal price;
        public decimal Price { set; get; }

 

               自動屬性可以避免我們手動聲明一個私有成員變量以及get和set的邏輯,快速寫一個類,這樣更加的方便。

          二.初始化的對比

    public class Product
    {
        public int ProductId { set; get; }
        public string Name { set; get; }
        public string Decription { set; get; }
        public decimal Price { set; get; }
        public string Category { set; get; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Product p = new Product();         //初始化對象
            p.ProductId = 1;
            p.Name = "張三";


            Product pp = new Product() { ProductId = 2, Name = "李四" };  //對象初始化器

            List<string> lists = new List<string>() { "張三", "李四", "王五" };  //集合初始化器

            List<Product> list = new List<Product> { new Product() { ProductId = 3, Name = "王五" },new Product{ProductId=4,Name="趙六"} };
            foreach (var item in list)          //匿名方法
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }

 

              學習了匿名類型,我們還是要區分一下我們和前面學習的,之前學習了初始化對象,就是方便了傳參,直接使用對象調用類的屬性定義參數的值;而對象初始化器和集合初始化器就是我們如上所示,其實是更加方便的給屬性賦值;在這里主要是一個新的知識,就是匿名類型,其實和匿名方法一樣,就是沒有名字,然后通過new實例化,再賦值,這樣的方式就是你匿名類型。剛開始接觸這個其實還是在我們學會了對象初始化器和集合初始化器這樣理解起來更加容易些。

          三.簡單的擴展方法

    class Program
    {
        static void Main(string[] args)
        {
            string str = "AbcD";
            Console.WriteLine(str.ToCamer());
            Console.WriteLine(str.ToPascal());
            Console.Read();
        }
    }
    public static class Stringstr
    {
        public static string ToCamer(this string s)
        {
            string first = s[0].ToString().ToLower();
            string last = s.Substring(1).ToLower();
            return first + last;
        }
        public static string ToPascal(this string s)
        {
            string first = s[0].ToString().ToUpper();
            string last = s.Substring(1).ToLower();
            return first + last;
        }
    }

 

                說起來擴展方法,其實就是我們在使用方法時間微軟沒有給我們提供我們想要的方法,所以我們可以自己寫一個方法實現,而這樣的方法實現就是擴展方法, 聲明擴展方法的步驟:類必須是static,方法是static,第一個參數是被擴展的對象,前面標注this。使用擴展方法的時候必須保證擴展方法類已經在當前代碼中using。擴展方法其實和我們之前寫的方法還是差不多的,最大的區別在於方法的參數,這里我們要區分開。
          四.LinQ表達式的總結
         //where的使用
        static void Main(string[] args)
        {
            string[] array = { "旋轉音樂盒", "好擠好擠", "愛的多米諾", "客官不可以", "下雨天", "晴天娃娃", "日不落", "黑發尤物" };
            Func<string, bool> func = i => i.Length < 5;       //集合中的字符串的長度小於5
            IEnumerable<string> wherelist = array.Where<string>(func);
            foreach (string item in wherelist)
            {
                Console.WriteLine(item);
            }

            Func<string, bool> f = i => i.Contains("");         //集合中的字符串包含“黑”的項
            IEnumerable<string> wherelists = array.Where<string>(f);
            foreach (var item in wherelists)
            {
                Console.WriteLine(item);
            }

            Func<string,int,bool> fun = (p, i) => (i % 2 == 1);     //在這里i這個參數是根據集合的索引,然后輸出索引為質數的系列中的字符串
            IEnumerable<string> wherelistss = array.Where<string>(fun);
            foreach (var item in wherelistss)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

 

                上面主要舉例說明了where的使用方法,它的輸出類型是bool類型,而在這里Lambda表達式也使用了方法.length(字符串或者數組的長度),和contains()方法,而contains方法的參數則是判斷是否包含該項。在使用where方法應該注意的是輸出類型,因為在這里很容易會以輸入的類型string作為輸出的類型,它啟示作用就是根據條件篩選輸出想要的結果。

        //select的使用
        static void Main(string[] args)
        {
            string[] array = { "旋轉音樂盒", "好擠好擠", "愛的多米諾", "客官不可以", "下雨天", "晴天娃娃", "日不落", "黑發尤物" };
            Func<string, int> func = i => i.Length;          //輸出集合中的每一項的長度
            IEnumerable<int> selectlist = array.Select<string,int>(func);        //在這里需要注意的是select<>的參數類型限制為輸入的類型和輸入的參數類型
            foreach (var item in selectlist)
            {
                Console.WriteLine(item);
            }

            var selects = array.Select(p=>new{p,p.Length});     //在這里使用匿名方法,輸入集合中各字符串的長度
            foreach (var item in selects)                     
            {
                Console.WriteLine(item);
            }

            var selectss = array.Select(p => new {name = p, p.Length });
            foreach (var item in selectss)
            {
                Console.WriteLine("歌曲名字是:{0},歌名的長度是:{1}", item.name,item.Length);
            }
            Console.ReadKey();
        }
        //selectmany的使用
        static void Main(string[] args)
        {
            string[] array = {"旋轉音樂盒","淋雨一直走","好擠好擠","愛的多米諾","客官不可以","下雨天","晴天娃娃","日不落","黑發尤物"};

            IEnumerable<char> chars = array.SelectMany(p=>p.ToArray());
            foreach (var item in chars)      //SelectMany這個方法傳入一個序列,可以輸出多個
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

 

                   使用select方法,輸出的類型可以為int類型,在這里也可以使用匿名方法,這樣使用更簡單的輸出集合的每一項。而selectMany方法則可以轉變為數組,然后遍歷出每一項。在這里可以存在類型轉換,還有就是在使用匿名方法時間返回一個var類型,而它是一個強類型,在編譯時間自動給我們生成它能夠辨別出的類型。

        static void Main(string[] args)
        {
            string[] array = { "旋轉音樂盒", "淋雨一直走", "好擠好擠", "愛的多米諾", "客官不可以", "下雨天", "晴天娃娃", "日不落", "黑發尤物" };
            //IEnumerable<string> arraylist = array.Take(5);   //輸出集合中的前五項
            //foreach (var item in arraylist)
            //{
            //    Console.WriteLine(item);
            //}

            IEnumerable<string> arraylists = array.TakeWhile(p => p.Length > 3);
            foreach (var item in arraylists)
            {
                Console.WriteLine(item);
            }

           //IEnumerable<string> skiplist = array.Skip(4);     //略過前四項,輸出后面的每一項
           //foreach (var item in skiplist)
           //{
           //    Console.WriteLine(item);
           //}

           //IEnumerable<string> skiplists = array.SkipWhile(s=>s.StartsWith("下"));   
           //foreach (var item in skiplists)
           //{ 
           //    Console.WriteLine(item);
           //}
            Console.ReadKey();
        }

 

                這里簡單的寫了take與skip兩個方法以及的TakeWhile和SkipWhile方法,而take是返回前幾條數據,skip是跳過幾條數據輸出后面的數據。

        static void Main(string[] args)
        {
            string[] array = { "旋轉音樂盒", "淋雨一直走", "好擠好擠", "愛的多米諾", "客官不可以", "下雨天", "晴天娃娃", "日不落", "黑發尤物" };
            IEnumerable<string> takelist=  array.Take(3);
            IEnumerable<string> skiplist = array.Skip(5);
            IEnumerable<string> concatlist = takelist.Concat(skiplist);   //Concat方法可以使兩個序列合並為一個序列
            foreach (var item in concatlist)
            {
                Console.WriteLine(item);
            }

            IEnumerable<string> orderbylist = array.OrderBy(p => p.Length);  //OrderBy方法是用來排序的,在這里是根據字符串的長度排序
            foreach (var item in orderbylist)
            {
                Console.WriteLine(item);
            }
            IEnumerable<string> orderbylistss = array.OrderByDescending(p=>p.Length).ThenBy(s=>s);
            foreach (var item in orderbylistss)  //OrderByDescending方法是可以根絕多個條件排序,在這里是根據俄字符串長度排序,如果長度相等,可以再根據字母的順序排序
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

 

                上面已經添加了注釋,嘿嘿,今天學習的知識點還是可以理解的,但是在使用讓面還是很陌生的,主要是使用LinQ中的一些方法,感覺使用起來還是有點困難的,這個需要做些練習的,我會好好的練習,就寫到這里,明天繼續努力orm框架。


免責聲明!

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



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