C Linq時代勿用Count函式判斷集合非空

2021-06-07 18:50:56 字數 1259 閱讀 2722

linq 出現之前,我們通常使用下面的方式來判斷集合是否非空,即集合包含元素:

var array = new int[0];

var b1 = array.length > 0;

var list = new list();

var b2 = list.count > 0;

var collection = new collection();

var b3 = collection.count > 0;

使用 length 或 count 屬性,上面的寫法沒有問題。

但到了 linq 時代,enumerable.count 擴充套件方法「統一了「 length 和 count 屬性,於是就有了下面判斷非空的寫法:

public static void someaction(ienumerablesource)//...

}

這種寫法可以,執行也正常,但可能會產生非常嚴重的效能的問題。

注意是可能,並不是一定,上面的方法如果傳入的是 array、list或collection,不會有問題。

那麼什麼時候會出問題呢?我們來看如下方法:

public static ienumerablegetnums(int start, int count)

如下呼叫時:

var nums = getnums(0, int.maxvalue);

someaction(nums);

執行速度會相當慢,我的電腦大約用了 70 秒的時間來執行 source.count() > 0。

分析下的話,你會發現 getnums 第 5 行** yield return i 執行了 int.maxvalue 次,有必要嗎?

其實只要返回乙個元素我們就可以斷定集合非空,完全不需要將所有的元素返回。

那又如何來判斷呢?我們可以使用 enumerable.any 擴充套件方法:

將 someaction 方法修改如下:

public static void someaction(ienumerablesource)//...

}

再次呼叫 ,你會發現執行時間可以忽略不計了。

總結下規律, count() > 0 遇上 yeild return 必定會出現效能問題。

enumerable.any 擴充套件方法可以解決我們的問題,但這個方法在命名上似乎有些問題,總感覺有點不順,如若判斷集合為空:

if (!source.any())

大資料時代 為什麼用HADOOP?

自 大 說的並不僅是資料的 多 不能用資料到了多少tb 多少pb 來說。對於大資料,可以用四個詞來表示 大量,多樣,實時,價值。實時 大資料需要快速的,實時的進行處理。如果說對時間要求低,那弄幾個機器,對小資料進行處理,等個十天半月的出來結果,這樣也沒有什麼意義了。有價值 資料中,存在著價值。資料,...

用物聯網技術將城市帶入智慧型時代

用物聯網技術將城市帶入智慧型時代 2017 12 20 10 53 22.0 智慧型城市是充分普及現代資訊科技 網際網路和人工智慧的城市,在這裡,人們能夠快速 便捷 充分地享受到系統化的公共服務和市場化服務。中國智慧型城市最大的優勢是充分運用了網際網路並且在此基礎上不斷創新。如在金融 商品購銷 共享...

網頁用多寬才更合適?多樣螢幕時代大問題

主機網全新上線,買空間 伺服器就上主機網,安全有保障!3 希望使用者認真閱讀的 主要內容區域的寬度必須固定,不能過長,否則會傷害到閱讀者的眼睛,而且不適合閱讀的流暢性。固定寬度在650左右最合適。有興趣的人可以去搜尋相關報告,為什麼是650左右。google是按照英文算的寬度,我們可以按照中文相對調...