如何在C 中高效地搜尋泛型集合

2022-02-22 13:33:10 字數 1863 閱讀 2711

例如,假設我們有兩個記憶體集合,乙個集合包含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

public idictionary> organizerestaurantsbycity(ienumerablecities, ienumerablerestaurants)212

13return

restaurantsbycity;

14 }

首先,我們例項化乙個以city為關鍵字的字典,每個關鍵字都指向一組restaurant 。

然後,我們遍歷city ,以根據cityid查詢匹配的restaurant 。

找到特定city 的 restaurants 後,便將其新增到字典中。

該解決方案似乎完全合理吧?

我相信您在職業生涯中也見過類似的經歷。

linq的缺點之一是它的便利性。

這聽起來可能違反直覺,但它使開發人員不得不編寫**來手動執行這些操作的日子變得抽象了。

在那些日子裡,您可能不得不考慮它們的效率,並立即發現巢狀迴圈。

這裡的問題隱藏在for每個迴圈中。

對於每個city,我們都在迭代整個restaurant 集合以尋找匹配項。

鑑於有大量的city 和 restaurant ,這種解決方案遠非理想。

最好,我們的**應保證兩個集合僅被迭代一次。

索引就是答案……

通過按cityid索引restaurant ,我們可以直接查詢它們。

因此,無需搜尋所有的物件。

linq為此目的設計了乙個很棒的擴充套件方法,稱為tolookup()。

1

public idictionary> organizerestaurantsbycity(ienumerablecities, ienumerablerestaurants)213

14return

restaurantsbycity;

15 }

您所要做的就是定義tolookup()方法用於索引集合的鍵。

在上面的**中,我們正在使用cityid。

假設您要查詢cityid為12的每家餐廳,只需 restaurantslookup [12]。

然後,我們可以通過使用restaurantlookup [city.id]遍歷city 來使用變數索引。

現在,我們有了乙個有效的解決方案,可以通過確保各自的集合重複一次,根據restaurant 所在的city 來組織 restaurant 。

我們可以將**進一步簡化為幾行:

1

public 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。字首樹是一種有向樹。那什麼是有向樹?顧名...