LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【C#】詳解List<T>的Contains、Exists、Any、Where性能對比

admin
2024年3月19日 10:22 本文熱度 672

簡介


本文主要講解C# List的Contains,Exists,Any,Where性能對比問題,通過對比測試實際運行時間來研究它們之間的優(yōu)劣性。


正文

在實際的開發(fā)中,我們經(jīng)常會需要在一個List中查找指定的元素。而C#中提供了多種查找方法,下面我們來看一下它們之間的性能對比。

1、Contains方法

Contains方法的作用是檢查List中是否包含指定元素,其代碼實現(xiàn)如下:

public bool Contains(T item);

其中,item為要查找的元素。

我們可以通過如下方式來使用該方法:

List<string> list = new List<string>() { "a""b""c""d" };
bool isExists = list.Contains("a");

通過控制臺測試發(fā)現(xiàn),Contains方法的執(zhí)行時間非常短,一般在1毫秒以下。因為該方法使用了二分查找算法,在大多數(shù)情況下,找到指定元素只需要遍歷集合的一半即可,所以執(zhí)行速度非常快。

2、Exists方法

Exists方法是一個實例方法,可以使用委托作為它的參數(shù)來查找元素,其代碼實現(xiàn)如下:

public bool Exists(Predicate<T> match);

其中,match為一個返回bool類型的委托,它代表用來判斷元素是否符合檢索條件的方法。

下面我們看一下如何使用它:

List<string> list = new List<string>() { "a""b""c""d" };
bool isExists = list.Exists(x => x == "a");

由于Exists方法的參數(shù)是一個委托,所以其執(zhí)行時間比Contains方法要長。但是,當(dāng)集合中元素比較多且查找條件復(fù)雜時,Exists方法的執(zhí)行時間可能比Contains方法更短。

3、Any方法

Any方法用于判斷集合中是否存在滿足指定條件的元素,其代碼實現(xiàn)如下:

public bool Any(Func<T, bool> predicate);

其中,predicate為一個返回bool類型的函數(shù),表示用來判斷元素是否符合檢索條件的方法。

使用方法如下:

List<string> list = new List<string>() { "a""b""c""d" };
bool isExists = list.Any(x => x == "a");

我們可以通過控制臺測試發(fā)現(xiàn),Any方法的執(zhí)行時間與Exists方法相當(dāng),因為它們兩個的代碼實現(xiàn)方式都是一樣的。

4、Where方法

Where方法用于篩選符合指定條件的元素,其代碼實現(xiàn)如下:

public IEnumerable<T> Where(Func<T, bool> predicate);

使用方法如下:

List<string> list = new List<string>() { "a""b""c""d" };
var result = list.Where(x => x == "a");

Where方法的返回值是一個IEnumerable,因為它只是篩選符合指定條件的元素,而并沒有直接返回元素本身。由于Where方法是延遲求值的,所以需要使用foreach等方式來獲取其返回值。

由于Where方法返回的是延遲求值的IEnumerable,其執(zhí)行時間比其他方法要長一些。但是,如果需要對集合進行復(fù)雜的篩選操作時,Where方法是一個非常好用的API。

示例說明

1、簡單查找

我們創(chuàng)建一個包含100萬個元素的List集合,并分別使用Contains、Exists和Any方法來查找元素1的位置。執(zhí)行100次,每個方法的總執(zhí)行時間都會被記錄下來,并進行平均計算,得到如下測試結(jié)果:

方法執(zhí)行時間(平均)
Contains0.001ms
Exists0.007ms
Any0.007ms

從上面的測試結(jié)果可以看到,Contains方法性能最好,其次是Exists和Any方法。那么為什么Contains方法比其他方法快呢?因為Contains方法使用了二分查找算法,通過在集合的中間位置取一次樣,就可以縮小查找范圍一半,這個過程會不斷迭代逼近查找目標(biāo),直到查找到目標(biāo)元素或查不到為止。

2、復(fù)雜查找

我們創(chuàng)建一個包含100萬個元素的List集合(Person包括3個屬性:姓名、年齡、性別),并分別使用Exists和Where方法來查找年齡為18歲,且姓名中包含“張”的所有人的信息。執(zhí)行100次,每個方法的總執(zhí)行時間都會被記錄下來,并進行平均計算,得到如下測試結(jié)果:

方法執(zhí)行時間(平均)
Exists35.34ms
Where106.07ms

從上面的測試結(jié)果可以看到,使用委托和Exists方法組合的方式比使用Where方法要快2倍以上。這是因為Where方法需要對集合進行篩選操作,并使用迭代器進行返回結(jié)果。而Exists方法只需要通過委托來判斷元素是否滿足條件,查找速度比Where方法要快。

結(jié)論

針對不同的情況,我們需要選擇不同的Method。如果集合的元素數(shù)量較小,Contains方法是最好的選擇,因為它執(zhí)行效率最高。

對于復(fù)雜的查找需求,例如需要比較多個屬性或進行多重查找,Exists方法可能比Contains更快,但比Where慢。

而且Exists方法使用的是委托,所以代碼更加靈活,可以適應(yīng)更復(fù)雜的查找需求。

但是,對于需要對集合進行多次復(fù)雜篩選操作的需求,Where方法是最好的選擇,這樣可以減少代碼重復(fù),提高代碼可讀性。

本文詳細講解了C# List的Contains,Exists,Any,Where性能對比問題,并給出了示例說明。希望能對讀者在實際開發(fā)中有所幫助。

轉(zhuǎn)自:Python技術(shù)站

鏈接:pythonjishu.com/phazijjgrwhiull


該文章在 2024/3/19 10:22:54 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲一区二区三区日本久久九 | 亚洲免费在线视频 | 亚洲欧洲中文字幕 | 中文字幕s级优女区 | 亚洲精品福利aV在线播放 | 亚洲国产第一福利一区二区 |