溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

List<T>搜索和排序中的方法有什么不不同

發(fā)布時(shí)間:2021-12-21 10:12:15 來(lái)源:億速云 閱讀:108 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“List<T>搜索和排序中的方法有什么不不同”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在.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)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI