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