本篇內(nèi)容介紹了“List<T>搜索和排序中的方法有什么不不同”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)北京,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575
在.NET 1.1時(shí),我還有很多和我一樣的程序員,都會(huì)常用到ArrayList,當(dāng)時(shí)要想對(duì)這種集合元素進(jìn)行查找,大多會(huì)采用for循環(huán)來(lái)完成,當(dāng)然也可以采用BinarySearch 方法。但自從有了.NET 2.0以及.NET 3.5后,ArrayList就已經(jīng)很少使用了,大家都認(rèn)為L(zhǎng)ist<T>在性能上要優(yōu)越于ArrayList。既然有了List<T>,有了LINQ,對(duì)于LIST<T>集合的查詢(xún)就不再單一。我這里列舉三種方法:它們共同完成一件事,在一個(gè)Person的集合中,查找編號(hào)大于50000的元素。Person類(lèi)定義如下:
public class Person { public string firstName { get; set; } public string lastName { get; set; } public int ID { get; set; } }
先構(gòu)造一個(gè)Person的泛型集合。當(dāng)然一般情況下不會(huì)有這樣的大集合,但為了比較不同方法的搜索性能,這是有必要的。
List<Person> list = new List<Person>(); for (int i = 0; i < 100001; i++) { Person p = new Person(); p.firstName = i.ToString() + "firstName"; p.lastName = i.ToString() + "lastName"; list.Add(p); }
1:List<T>提供的FindAll方式。
public class FindPerson { public string firstName; public FindPerson(string _firstName) { this.firstName = _firstName; } public bool PersonPredicate(Person p) { return p.ID >= 50000; } } Stopwatch sw = new Stopwatch(); sw.Start(); List<Person> persons = list.FindAll(new Predicate<Person>(fp.PersonPredicate)); sw.Stop(); Response.Write("Find方法搜索用時(shí)" + sw.ElapsedMilliseconds.ToString() + "<br/>");
2:傳統(tǒng)的for循環(huán)。
sw.Start(); List<Person> newPersons = new List<Person>(); for (int j = 0; j < list.Count; j++) { if (list[j].ID >= 50000) { newPersons.Add(list[j]); } } sw.Stop(); Response.Write("for循環(huán)搜索用時(shí)" + sw.ElapsedMilliseconds.ToString() + "<br/>");
3:LINQ方式查詢(xún)。
sw = new Stopwatch(); sw.Start(); var pn = (from m in list where m.ID >=50000 select m).ToList <Person >(); sw.Stop(); Response.Write("linq搜索用時(shí)" + sw.ElapsedMilliseconds.ToString() + "<br/>");
輸出結(jié)果:雖然用時(shí)差不多,但還是傳統(tǒng)的for循環(huán)性能***,盡管寫(xiě)法上并無(wú)新意。FindAll我覺(jué)的有一點(diǎn)比較好的就是,如果針對(duì)List<Person>有很多種查詢(xún)方式,(當(dāng)然實(shí)際情況中Person類(lèi)不會(huì)這么簡(jiǎn)單),把查詢(xún)方式封閉在FindPerson類(lèi)中比較好,這樣在外部調(diào)用查詢(xún)時(shí)會(huì)非常簡(jiǎn)單。如果是其它的方式,也可以封裝,但明顯在代碼結(jié)構(gòu)上要稍差。Linq方式的查詢(xún),在靈活性上我覺(jué)的比起前兩種要差一些。
Find方法搜索用時(shí)5
for循環(huán)搜索用時(shí)4
linq搜索用時(shí)6
第二:再來(lái)看對(duì)List<T>的排序,這里比較List<T>提供的Sort方法和Linq方式的orderby。
1:Sort。這里先寫(xiě)一個(gè)自定義的比較類(lèi)PersonComparer
public class PersonComparer : IComparer<Person> { public int Compare(Person x, Person y) { return x.ID.CompareTo(y.ID); } }
排序代碼:
sw = new Stopwatch(); sw.Start(); list.Sort(new PersonComparer()); sw.Stop(); Response.Write("Sort排序用時(shí)" + sw.ElapsedMilliseconds.ToString() + "<br/>");
2:Linq方式。
sw = new Stopwatch(); sw.Start(); var pn = (from m in list orderby m.ID descending select m).ToList<Person>(); sw.Stop(); Response.Write("linq排序用時(shí)" + sw.ElapsedMilliseconds.ToString() + "<br/>");
輸出結(jié)果:在排序上linq還是占有比較大的優(yōu)勢(shì)。
Sort排序用時(shí)670
linq排序用時(shí)195
“List<T>搜索和排序中的方法有什么不不同”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
當(dāng)前名稱(chēng):List<T>搜索和排序中的方法有什么不不同
文章起源:http://jinyejixie.com/article20/gdjoco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)、ChatGPT、品牌網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)