【C#】詳解List<T>的Contains、Exists、Any、Where性能對(duì)比
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
簡(jiǎn)介本文主要講解C# List的Contains,Exists,Any,Where性能對(duì)比問(wèn)題,通過(guò)對(duì)比測(cè)試實(shí)際運(yùn)行時(shí)間來(lái)研究它們之間的優(yōu)劣性。正文 在實(shí)際的開(kāi)發(fā)中,我們經(jīng)常會(huì)需要在一個(gè)List中查找指定的元素。而C#中提供了多種查找方法,下面我們來(lái)看一下它們之間的性能對(duì)比。 1、Contains方法 Contains方法的作用是檢查L(zhǎng)ist中是否包含指定元素,其代碼實(shí)現(xiàn)如下: public bool Contains(T item); 其中,item為要查找的元素。 我們可以通過(guò)如下方式來(lái)使用該方法:
通過(guò)控制臺(tái)測(cè)試發(fā)現(xiàn),Contains方法的執(zhí)行時(shí)間非常短,一般在1毫秒以下。因?yàn)樵摲椒ㄊ褂昧硕植檎宜惴?,在大多?shù)情況下,找到指定元素只需要遍歷集合的一半即可,所以執(zhí)行速度非??臁?/span> 2、Exists方法 Exists方法是一個(gè)實(shí)例方法,可以使用委托作為它的參數(shù)來(lái)查找元素,其代碼實(shí)現(xiàn)如下: public bool Exists(Predicate<T> match); 其中,match為一個(gè)返回bool類型的委托,它代表用來(lái)判斷元素是否符合檢索條件的方法。 下面我們看一下如何使用它:
由于Exists方法的參數(shù)是一個(gè)委托,所以其執(zhí)行時(shí)間比Contains方法要長(zhǎng)。但是,當(dāng)集合中元素比較多且查找條件復(fù)雜時(shí),Exists方法的執(zhí)行時(shí)間可能比Contains方法更短。 3、Any方法 Any方法用于判斷集合中是否存在滿足指定條件的元素,其代碼實(shí)現(xiàn)如下: public bool Any(Func<T, bool> predicate); 其中,predicate為一個(gè)返回bool類型的函數(shù),表示用來(lái)判斷元素是否符合檢索條件的方法。 使用方法如下:
我們可以通過(guò)控制臺(tái)測(cè)試發(fā)現(xiàn),Any方法的執(zhí)行時(shí)間與Exists方法相當(dāng),因?yàn)樗鼈儍蓚€(gè)的代碼實(shí)現(xiàn)方式都是一樣的。 4、Where方法 Where方法用于篩選符合指定條件的元素,其代碼實(shí)現(xiàn)如下: public IEnumerable<T> Where(Func<T, bool> predicate); 使用方法如下:
Where方法的返回值是一個(gè)IEnumerable,因?yàn)樗皇呛Y選符合指定條件的元素,而并沒(méi)有直接返回元素本身。由于Where方法是延遲求值的,所以需要使用foreach等方式來(lái)獲取其返回值。 由于Where方法返回的是延遲求值的IEnumerable,其執(zhí)行時(shí)間比其他方法要長(zhǎng)一些。但是,如果需要對(duì)集合進(jìn)行復(fù)雜的篩選操作時(shí),Where方法是一個(gè)非常好用的API。 示例說(shuō)明 1、簡(jiǎn)單查找 我們創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元素的List集合,并分別使用Contains、Exists和Any方法來(lái)查找元素1的位置。執(zhí)行100次,每個(gè)方法的總執(zhí)行時(shí)間都會(huì)被記錄下來(lái),并進(jìn)行平均計(jì)算,得到如下測(cè)試結(jié)果:
從上面的測(cè)試結(jié)果可以看到,Contains方法性能最好,其次是Exists和Any方法。那么為什么Contains方法比其他方法快呢?因?yàn)镃ontains方法使用了二分查找算法,通過(guò)在集合的中間位置取一次樣,就可以縮小查找范圍一半,這個(gè)過(guò)程會(huì)不斷迭代逼近查找目標(biāo),直到查找到目標(biāo)元素或查不到為止。 2、復(fù)雜查找 我們創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元素的List集合(Person包括3個(gè)屬性:姓名、年齡、性別),并分別使用Exists和Where方法來(lái)查找年齡為18歲,且姓名中包含“張”的所有人的信息。執(zhí)行100次,每個(gè)方法的總執(zhí)行時(shí)間都會(huì)被記錄下來(lái),并進(jìn)行平均計(jì)算,得到如下測(cè)試結(jié)果:
從上面的測(cè)試結(jié)果可以看到,使用委托和Exists方法組合的方式比使用Where方法要快2倍以上。這是因?yàn)閃here方法需要對(duì)集合進(jìn)行篩選操作,并使用迭代器進(jìn)行返回結(jié)果。而Exists方法只需要通過(guò)委托來(lái)判斷元素是否滿足條件,查找速度比Where方法要快。 結(jié)論 針對(duì)不同的情況,我們需要選擇不同的Method。如果集合的元素?cái)?shù)量較小,Contains方法是最好的選擇,因?yàn)樗鼒?zhí)行效率最高。 對(duì)于復(fù)雜的查找需求,例如需要比較多個(gè)屬性或進(jìn)行多重查找,Exists方法可能比Contains更快,但比Where慢。 而且Exists方法使用的是委托,所以代碼更加靈活,可以適應(yīng)更復(fù)雜的查找需求。 但是,對(duì)于需要對(duì)集合進(jìn)行多次復(fù)雜篩選操作的需求,Where方法是最好的選擇,這樣可以減少代碼重復(fù),提高代碼可讀性。 本文詳細(xì)講解了C# List的Contains,Exists,Any,Where性能對(duì)比問(wèn)題,并給出了示例說(shuō)明。希望能對(duì)讀者在實(shí)際開(kāi)發(fā)中有所幫助。
該文章在 2024/3/19 10:22:54 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |