例如,假設我們有兩個記憶體集合,乙個集合包含city 模型,另乙個集合包含restaurant 模型。
我們的系統需要按city 組織 restaurant :
這是我們的模型,其中restaurant的cityid屬性用於標識其居住的city:
1我們的目標是優化組織集合的操作。public
class
city24
public
string name 5}
67public
class
restaurant810
public guid cityid
11public
string name
12 }
為了做到這一點,我們必須確保對記憶體中的集合進行盡可能少的迭代。
首先讓我們看一下效率低下的解決方案,並討論如何對其進行改進。
1首先,我們例項化乙個以city為關鍵字的字典,每個關鍵字都指向一組restaurant 。public idictionary> organizerestaurantsbycity(ienumerablecities, ienumerablerestaurants)212
13return
restaurantsbycity;
14 }
然後,我們遍歷city ,以根據cityid查詢匹配的restaurant 。
找到特定city 的 restaurants 後,便將其新增到字典中。
該解決方案似乎完全合理吧?
我相信您在職業生涯中也見過類似的經歷。
linq的缺點之一是它的便利性。
這聽起來可能違反直覺,但它使開發人員不得不編寫**來手動執行這些操作的日子變得抽象了。
在那些日子裡,您可能不得不考慮它們的效率,並立即發現巢狀迴圈。
這裡的問題隱藏在for每個迴圈中。
對於每個city,我們都在迭代整個restaurant 集合以尋找匹配項。
鑑於有大量的city 和 restaurant ,這種解決方案遠非理想。
最好,我們的**應保證兩個集合僅被迭代一次。
索引就是答案……
通過按cityid索引restaurant ,我們可以直接查詢它們。
因此,無需搜尋所有的物件。
linq為此目的設計了乙個很棒的擴充套件方法,稱為tolookup()。
1您所要做的就是定義tolookup()方法用於索引集合的鍵。public idictionary> organizerestaurantsbycity(ienumerablecities, ienumerablerestaurants)213
14return
restaurantsbycity;
15 }
在上面的**中,我們正在使用cityid。
假設您要查詢cityid為12的每家餐廳,只需 restaurantslookup [12]。
然後,我們可以通過使用restaurantlookup [city.id]遍歷city 來使用變數索引。
現在,我們有了乙個有效的解決方案,可以通過確保各自的集合重複一次,根據restaurant 所在的city 來組織 restaurant 。
我們可以將**進一步簡化為幾行:
1public idictionary> organizerestaurantsbycity(ienumerablecities, ienumerablerestaurants)
2
現代C 如何高效地設計建構函式
不知道啥是std move 的同學請簡單做一下課前預習。先從乙個我們非常熟悉的情形入手,我們需要寫乙個student類,傳入引數為std string,任何一名上課認真聽講的學生都會想到傳const class student private std string name 讓我們拋開c 11後引入...
如何在ARM下進行高效的C程式設計?
如何在arm下進行高效的c程式設計?1.對區域性變數 函式引數和返回值要使用signed和unsigned int型別。這樣可以避免型別轉換,而且可高效地使用arm的32位資料操作指令。2.最高效的迴圈體形式是減計數到零 counts down to zero 的do while迴圈。3.展開重要的...
樹的深度優先搜尋(上) 如何才能高效率地查字典?
在平時的生活中,我們查字典都是從單詞的最左邊的字母開始,逐個去查詢。比如查詢 boy 這個單詞,我們一般是這麼查的。首先,在 a z 這 26 個英文本母裡找到單詞的第乙個字母 b,然後在 b 開頭的單詞裡找到字母 o,最終在 bo 開頭的單詞裡找到字母 y。字首樹是一種有向樹。那什麼是有向樹?顧名...