a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C# > 正文

linq語(yǔ)法基礎(chǔ)使用示例

2020-01-24 02:56:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

借助于LINQ技術(shù),我們可以使用一種類似SQL的語(yǔ)法來(lái)查詢?nèi)魏涡问降臄?shù)據(jù)。從技術(shù)角度而言,LINQ定義了大約40個(gè)查詢操作符,如from, select, in, where, group by, orderby, … 使用這些操作符可以編寫查詢語(yǔ)句。

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

上手簡(jiǎn)單是學(xué)習(xí)LINQ的一大好處,語(yǔ)法很像SQL語(yǔ)句的語(yǔ)法。而且學(xué)一種技術(shù),可以當(dāng)多種技術(shù)來(lái)使用。這是不是很像那種多功能刀,一刀在手,生活無(wú)憂。LINQ支持集合、XML、數(shù)據(jù)庫(kù)的查詢。寫代碼就像說(shuō)話,多必失,所以呢,盡量?jī)?yōu)化自己的代碼。這不但有利于減少錯(cuò)誤的發(fā)生,也有利于提高生產(chǎn)率、降低維護(hù)的成本。而使用LINQ也是奔著這個(gè)方向發(fā)展。

坦白說(shuō),我看到網(wǎng)上有很多LINQ方面的教程,知識(shí)面介紹都挺好。我只能是厚著臉皮,站在巨人的肩膀上馳騁。本文基本是源于博友08年的文章,感覺(jué)他寫的很好。雖然抄襲是很可恥的行為,但是回想大學(xué)能順利畢業(yè),論文也是東抄一塊,西抄一塊。所以現(xiàn)在我是很“蛋定”了。我要響應(yīng)魯老爺?shù)哪脕?lái)主義精神。

LINQ是一種查詢語(yǔ)言,所以呢,運(yùn)用的場(chǎng)景當(dāng)然也就是查詢羅。查哪些,包括LINQ TO OBJECCT、LINQ TO XML、LINQ TO DATABASE。可以說(shuō)查詢的范圍很廣。每一種都可以出一系列的文章,我們這里主要還是講 LINQ TO OBJECCT。

來(lái)看看從集合中,我們是怎么來(lái)查詢需要的值。

復(fù)制代碼 代碼如下:

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>
        /// 國(guó)家
        /// </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();
        }
    }
}

上面的方法可以說(shuō)是最直接,最容易想到的方法。上面的實(shí)現(xiàn)怎么看也沒(méi)有覺(jué)得有什么好復(fù)用的,但是事實(shí)是怎么樣?就有牛人看出了名堂,善于歸納上面的問(wèn)題就是判斷是跟不是的問(wèn)題,就想到要去提出來(lái),供以后復(fù)用。 當(dāng)然復(fù)用之路也不是一蹴而就的,也是日積月累而成。所以我們也來(lái)看看過(guò)渡的過(guò)程。

復(fù)制代碼 代碼如下:

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

如果說(shuō)只是如下方式來(lái)實(shí)現(xiàn)的話,那還真是白費(fèi)力氣了。

復(fù)制代碼 代碼如下:

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

但是結(jié)合到委托的話,我們就可以把IsExist(People p)當(dāng)成一個(gè)參數(shù)來(lái)進(jìn)行傳遞。這里我們過(guò)渡再快一點(diǎn),我們把查詢的那一段代碼提到另一類Helper供以后得用。我們來(lái)看看Helper類的代碼實(shí)現(xiàn)。限于篇幅的問(wèn)題,只截Helper類的方法。

復(fù)制代碼 代碼如下:

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


        /// <summary>
        /// 獲取滿足條件的數(shù)據(jù)
         /// </summary>
        /// <param name="listPeople">數(shù)據(jù)集</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;
        }
    }

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

復(fù)制代碼 代碼如下:

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>();

 

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

 

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

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

Helper類的擴(kuò)展代碼如下:

復(fù)制代碼 代碼如下:

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


        /// <summary>
        /// 獲取滿足條件的數(shù)據(jù)
        /// </summary>
        /// <param name="listPeople">數(shù)據(jù)集</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方法的調(diào)用,是不是很直觀了,就像調(diào)用集合的方法,并給傳遞委托條件即可了。Main方法如下:

復(fù)制代碼 代碼如下:

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>();

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

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

上面是使用GetPeopleResult方法名,但是我們想要的話,是不是就可以實(shí)現(xiàn)諸如Select、Where、OrderBy等方法了。基本上方法的介紹就已經(jīng)完了。但是有一個(gè)大的問(wèn)題,那就是它還比較死,不靈活,因?yàn)槲覀儾豢赡苷f(shuō)每個(gè)集合里面的對(duì)象(本文是People)都重復(fù)來(lái)寫。這里肯定是需要提供一種方式,使它能夠接受不同的對(duì)象,這樣才有利于我們復(fù)用。因?yàn)镮List繼承自IEnumerable,所以可以給IEnumerable實(shí)現(xiàn)擴(kuò)展方法,然后利用泛型的特征,就可以給不同的對(duì)象來(lái)復(fù)用,代碼如下:

復(fù)制代碼 代碼如下:

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里出現(xiàn)的一個(gè)關(guān)鍵字,返回一個(gè)迭代器
                    yield return t;
                }
            }
        }
    }

Main方法就不貼全部了,畢竟上面都重復(fù)好幾回,只貼調(diào)用那一句:

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

正式結(jié)束

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久亚洲一区二区三 | 99久久精品免费看国产免费软件 | 国产成人福利在线观看 | 国产精品久久久久9999赢消 | 精品在线播放 | 97成人在线视频 | 国产一区免费在线观看 | 久久久久久久网 | 爱爱视频网站 | 国产精品视频播放 | 欧美视频第一页 | www.一区二区三区 | 国产精品99久久久久久动医院 | 欧美一级大片 | 久久99视频精品 | 韩日一区二区三区 | 日韩成人在线播放 | 日韩在线视频一区 | 亚洲午夜精品一区二区三区他趣 | 国产精品福利在线观看 | 国产精品国产精品国产专区不卡 | 国产精品久久久久久久久久三级 | 欧美日韩91 | 精品国产91 | 超级乱淫片国语对白免费视频 | 婷婷亚洲五月 | 亚洲欧美在线免费观看 | h免费在线观看 | 精品国产一区二区三区在线观看 | 欧美综合一区二区三区 | 亚洲三级黄 | 蜜桃久久久 | 国产成人精品久久二区二区91 | 在线视频成人 | a久久免费视频 | julia中文字幕久久一区二区 | 精品国产乱码久久久久久1区2区 | www日韩欧美| 国产一区二区视频在线 | 日韩中文字幕第一页 | 欧美久久一级特黄毛片 |