亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

linq語法基礎使用示例

2020-01-24 02:56:13
字體:
來源:轉載
供稿:網友

借助于LINQ技術,我們可以使用一種類似SQL的語法來查詢任何形式的數據。從技術角度而言,LINQ定義了大約40個查詢操作符,如from, select, in, where, group by, orderby, … 使用這些操作符可以編寫查詢語句。

做軟件的,總想代碼要怎么樣才能更好地復用,要怎么樣才更利于擴展,要怎么樣更能以不變應萬變。就如同微軟框架所提供的API一樣,在一定程度上避免開發者重復造輪子。拿LINQ來說吧,.NET Framework3.5及之后的版本都已經封裝進去,供成千上百萬的開發者使用。同一套LINQ語法,它能支持LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE。復用、減少開發工作量及降低學習成本等好處都是不言而喻的。LINQ的學習很像SQL,所以有使用過SQL語句的話,感覺還是蠻熟悉的。

上手簡單是學習LINQ的一大好處,語法很像SQL語句的語法。而且學一種技術,可以當多種技術來使用。這是不是很像那種多功能刀,一刀在手,生活無憂。LINQ支持集合、XML、數據庫的查詢。寫代碼就像說話,多必失,所以呢,盡量優化自己的代碼。這不但有利于減少錯誤的發生,也有利于提高生產率、降低維護的成本。而使用LINQ也是奔著這個方向發展。

坦白說,我看到網上有很多LINQ方面的教程,知識面介紹都挺好。我只能是厚著臉皮,站在巨人的肩膀上馳騁。本文基本是源于博友08年的文章,感覺他寫的很好。雖然抄襲是很可恥的行為,但是回想大學能順利畢業,論文也是東抄一塊,西抄一塊。所以現在我是很“蛋定”了。我要響應魯老爺的拿來主義精神。

LINQ是一種查詢語言,所以呢,運用的場景當然也就是查詢羅。查哪些,包括LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE??梢哉f查詢的范圍很廣。每一種都可以出一系列的文章,我們這里主要還是講 LINQ TO OBJECCT。

來看看從集合中,我們是怎么來查詢需要的值。

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqApplication
{
    class People
    {
        /// <summary>
        /// 名字
        /// </summary>
        public string FirstName { get; set; }
        /// <summary>
        /// 姓氏
        /// </summary>
        public string LastName { get; set; }
        /// <summary>
        /// 國家
        /// </summary>
        public string Country { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {

            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };
            List<People> result = new List<People>();

            foreach (People p in listPeople)
            {
                if (p.Country == "China")
                {
                    result.Add(p);

                }
            }

            foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }
    }
}

上面的方法可以說是最直接,最容易想到的方法。上面的實現怎么看也沒有覺得有什么好復用的,但是事實是怎么樣?就有牛人看出了名堂,善于歸納上面的問題就是判斷是跟不是的問題,就想到要去提出來,供以后復用。 當然復用之路也不是一蹴而就的,也是日積月累而成。所以我們也來看看過渡的過程。

復制代碼 代碼如下:

/// <summary>
        /// 判斷是否存在
         /// </summary>
        /// <param name="p">對象</param>
        public static bool IsExist(People p)
        {
            return p.Country == "China";
        }

如果說只是如下方式來實現的話,那還真是白費力氣了。

復制代碼 代碼如下:

foreach (People p in listPeople)
            {
                if (IsExist(p))
                {
                    result.Add(p);
                }
            }

但是結合到委托的話,我們就可以把IsExist(People p)當成一個參數來進行傳遞。這里我們過渡再快一點,我們把查詢的那一段代碼提到另一類Helper供以后得用。我們來看看Helper類的代碼實現。限于篇幅的問題,只截Helper類的方法。

復制代碼 代碼如下:

public class Helper
    {
        //聲明委托
        public delegate bool ExistPeople(People p);


        /// <summary>
        /// 獲取滿足條件的數據
         /// </summary>
        /// <param name="listPeople">數據集</param>
        /// <param name="existPeople">條件</param>
        public static List<People> GetPeopleResult(IList<People> listPeople, ExistPeople existPeople)
        {
            List<People> result = new List<People>();
            foreach (People p in listPeople)
            {
                if (existPeople(p))
                {
                    result.Add(p);
                }
            }
            return result;
        }
    }

這樣我們就可以直接調用,來獲取滿足條件的數據了。也可以使用C#2.0提供的匿名委托,還可以使用C#3.0的Lambda表述式。代碼如下:

復制代碼 代碼如下:

static void Main(string[] args)
        {
            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };

            IList<People> result = new List<People>();

 

            //直接調用
              result = Helper.GetPeopleResult(listPeople, IsExist);
            //匿名委托
              //result = Helper.GetPeopleResult(listPeople, delegate(People p){ return p.Country == "China" ? true : false;});
            //Lambda表達式
              //result = Helper.GetPeopleResult(listPeople, people => people.Country == "China");          

 

            foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }

講到這里,對于具體集合的查詢基本上是完成了,但是呢,C#3.0還提供了一種方法,使調用的代碼更加直觀,那就是擴展方法。通過擴展IList集合的方法,我們就可以通過IList來調用并傳遞委托條件即可。

Helper類的擴展代碼如下:

復制代碼 代碼如下:

public static class Helper
    {
        //聲明委托
        public delegate bool ExistPeople(People p);


        /// <summary>
        /// 獲取滿足條件的數據
        /// </summary>
        /// <param name="listPeople">數據集</param>
        /// <param name="existPeople">條件</param>
        public static IList<People> GetPeopleResult(this IList<People> listPeople, ExistPeople existPeople)
        {
            List<People> result = new List<People>();
            foreach (People p in listPeople)
            {
                if (existPeople(p))
                {
                    result.Add(p);
                }
            }
            return result;
        }
    }

我們看Main方法的調用,是不是很直觀了,就像調用集合的方法,并給傳遞委托條件即可了。Main方法如下:

復制代碼 代碼如下:

static void Main(string[] args)
        {
            List<People> listPeople = new List<People>()
            {
                new People{FirstName="Peter",LastName="Zhang",Country="China"},
                new People{FirstName="Alan",LastName="Guo",Country="Japan"},
                new People{FirstName="Linda",LastName="Tang",Country="China"}
            };

            IList<People> result = new List<People>();

            //直接調用
              //result = Helper.GetPeopleResult(listPeople, IsExist);
            //匿名委托
              //result = Helper.GetPeopleResult(listPeople, delegate(People p){ return p.Country == "China";});
            //Lambda表達式
              //result = Helper.GetPeopleResult(listPeople, people => people.Country == "China");
            //擴展方法調用
              result = listPeople.GetPeopleResult(people => people.Country == "China");

            foreach(People p in result)
            {
                Console.WriteLine("Your name is :" + p.FirstName + " " + p.LastName);
            }
            Console.ReadKey();
        }

上面是使用GetPeopleResult方法名,但是我們想要的話,是不是就可以實現諸如Select、Where、OrderBy等方法了?;旧戏椒ǖ慕榻B就已經完了。但是有一個大的問題,那就是它還比較死,不靈活,因為我們不可能說每個集合里面的對象(本文是People)都重復來寫。這里肯定是需要提供一種方式,使它能夠接受不同的對象,這樣才有利于我們復用。因為IList繼承自IEnumerable,所以可以給IEnumerable實現擴展方法,然后利用泛型的特征,就可以給不同的對象來復用,代碼如下:

復制代碼 代碼如下:

public static class Helper
    {
        public delegate bool Condtion<T>(T t);
        public static IEnumerable<T> GetPeopleResult<T>(this  IEnumerable<T> items, Condtion<T> condition)
        {
            foreach (T t in items)
            {
                if (condition(t))
                {
                    //C# 2.0里出現的一個關鍵字,返回一個迭代器
                    yield return t;
                }
            }
        }
    }

Main方法就不貼全部了,畢竟上面都重復好幾回,只貼調用那一句:

復制代碼 代碼如下:

IEnumerable<People> result = Helper.GetPeopleResult<People>(listPeople, people => people.Country == "China");

而C# 3.0則給我們提供var關鍵字,被稱為推斷類型。
var 關鍵字能指示編譯器根據初始化語句右側的表達式推斷變量的類型。推斷類型可以是內置類型、匿名類型、用戶定義類型、.NET Framework 類庫中定義的類型或任何表達式。所以上面的式子可以寫成如下方式:

復制代碼 代碼如下:

var result = Helper.GetPeopleResult<People>(listPeople, people => people.Country == "China");

正式結束

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线免费视频| 国产成人精品最新| 欧美大成色www永久网站婷| 久久亚洲一区二区三区四区五区高| 亚洲999一在线观看www| 久久免费视频网站| 国产美女高潮久久白浆| 欧美日韩不卡合集视频| 2020欧美日韩在线视频| 亚洲国产97在线精品一区| 国产ts人妖一区二区三区| 国产suv精品一区二区三区88区| 视频在线观看99| 在线观看国产精品日韩av| 国产精品av在线播放| 久久天天躁夜夜躁狠狠躁2022| 欧美性感美女h网站在线观看免费| 1769国产精品| 亚洲精品日韩在线| 亚洲国产精品电影| 成人黄色免费在线观看| 欧美在线视频导航| 亚洲аv电影天堂网| 成人黄色在线观看| 国产精品色视频| 欧美精品在线免费观看| 欧美黄色成人网| 久久免费观看视频| 亚洲人午夜色婷婷| 4388成人网| 欧美成人免费在线观看| 精品久久久久久中文字幕一区奶水| 青青草国产精品一区二区| 欧美www视频在线观看| 日韩av在线网站| 国产日产久久高清欧美一区| 亚洲国产欧美一区二区三区久久| 亚洲国产精品网站| 亚洲第一天堂av| 成人av在线天堂| 最近2019中文免费高清视频观看www99| 亚洲美女福利视频网站| 亚洲国产精品久久精品怡红院| 亚洲a级在线播放观看| 亚洲在线免费视频| 日韩成人在线电影网| 日韩电影免费观看在线| 欧美高清在线视频观看不卡| 一区二区福利视频| 日韩激情av在线播放| 国产精品久久久久久久电影| 亚洲mm色国产网站| 国产啪精品视频网站| 操91在线视频| 亚洲激情 国产| 欧美成人剧情片在线观看| 亚洲欧美综合精品久久成人| 久久中文久久字幕| 欧美剧在线观看| 狠狠躁天天躁日日躁欧美| 日韩毛片在线看| 亚洲欧美国产另类| 91精品综合视频| 国产一区二区三区视频在线观看| 欧美专区国产专区| 亚洲精品天天看| 欧美激情亚洲一区| 亚洲精品国精品久久99热| 粉嫩av一区二区三区免费野| 国产精品jvid在线观看蜜臀| 欧美视频一二三| 久久亚洲影音av资源网| 国产精品久久久av久久久| 最近中文字幕2019免费| 亚洲国产精品国自产拍av秋霞| 久久6精品影院| 一区二区三区国产在线观看| 亚洲石原莉奈一区二区在线观看| 中文字幕9999| 亚洲最新中文字幕| 国产精品99久久久久久www| 欧美亚洲国产日韩2020| 久久久久久亚洲精品中文字幕| 日本高清+成人网在线观看| 国产日韩欧美在线| 久久影院中文字幕| 18性欧美xxxⅹ性满足| 国产精品狼人色视频一区| 国产精品久久久久久久av大片| 亚洲午夜久久久久久久| 日韩女优人人人人射在线视频| 日本久久亚洲电影| 国产不卡av在线| 久操成人在线视频| 91美女福利视频高清| 久久精品国产一区二区电影| 9.1国产丝袜在线观看| 亚洲免费精彩视频| 日韩免费在线播放| 91精品久久久久久久久久久| 亚洲精品第一页| 久久全国免费视频| 亚洲精品中文字| 亚洲激情在线观看| 欧美日韩国产中字| 欧美成人高清视频| 深夜成人在线观看| 国产亚洲成精品久久| 欧美午夜精品久久久久久久| 亚洲自拍偷拍第一页| 少妇av一区二区三区| 成人www视频在线观看| 久久躁日日躁aaaaxxxx| 2021久久精品国产99国产精品| 中文欧美日本在线资源| 91精品视频在线| 日韩第一页在线| 亚洲伊人成综合成人网| 欧美激情一区二区三区高清视频| 日本成人在线视频网址| 最近2019中文字幕一页二页| 在线播放国产一区中文字幕剧情欧美| 欧美在线激情视频| 日韩av在线一区二区| 国产精品美女呻吟| 国产精品一区二区三区久久| 欧美性猛交xxxx久久久| 亚洲人成免费电影| 色偷偷噜噜噜亚洲男人| 亚洲精品之草原avav久久| 国产精品久久精品| 国产91色在线免费| 久久久视频免费观看| 久久人人爽人人爽人人片av高清| 精品国产91乱高清在线观看| 久久视频免费在线播放| 国产精品欧美日韩久久| 日本免费一区二区三区视频观看| 亚洲国产日韩欧美在线99| 亚洲精品久久久久久下一站| 国产成人a亚洲精品| 九九热精品视频| 亚洲精品久久视频| 57pao成人永久免费视频| 亚洲乱码av中文一区二区| 久久九九免费视频| 亚洲国产精品女人久久久| 成人有码在线播放| 成人淫片在线看| 欧美一区二区三区精品电影| 日韩av免费网站| 亚洲国产91精品在线观看| 色妞久久福利网| 成人激情在线观看| 亚洲91av视频| 国产精品成人av性教育| 45www国产精品网站| 日本精品视频在线观看| 欧美尤物巨大精品爽| 精品福利在线视频| 日本精品久久久久影院| 在线观看欧美视频| 国产精品久久视频| 欧美电影在线免费观看网站|