簡體   English   中英

存儲對象列表並將一個屬性標識為Key以進行快速查找

[英]Storing a list of objects and identifying one property as a Key for fast lookup

可以說我有一個storyCharacter對象列表。 每個對象都存儲一個ID#,名稱和喜歡的顏色,例如以下示例:

ID#   |  Name        |  Favorite Color
21    |  Optimus     |  Blue
29    |  Ironhide    |  Red
34    |  Starscream  |  White

創建一個鍵-值對以便將其鍵控到ID#的最佳方法是什么。

我知道我可以使用字典,但會

dictionary.Add(storyCharacter1.IDnum, storyCharacter1);

成為一個好方法嗎? 我認為這種方式將把ID的副本作為鍵,因此不必要地消耗更多的內存,因為該信息已經在對象中了。 當然,我不能只是將IDnum存儲在storyCharacter對象中,而只能將其用作鍵。 因為那樣會創建一個僅包含名稱和顏色的對象,然后將其與IDnum的鍵相關聯,所以感覺就像我正在解耦應該保持在一起的數據。

我也可以使用List <>,但是然后我必須進行foreach並進行瀏覽,或者使用LINQ。

那么,是否有一種方法可以存儲(某種形式的)對象列表,並將該對象的一個​​元素標識為鍵? 如果沒有,那么有什么替代方法可以做類似的事情,它們之間的權衡是什么?

創建這樣的字典是加快查找內容的常見且完全有效的方法。 使用更多的內存來獲得更多的性能是常見的折衷方案。

如果IDNum是double精度數,字典最多將每個鍵使用8個字節(我懷疑),除此之外,字典每個鍵將使用4個字節。 如果IDNum是一個對象,它不會復制整個對象只是對其的引用(在32位系統上占用4個字節)。

但是...您真的有記憶問題嗎? 這是在嵌入式設備還是內存不足的設備上? 過早的優化(對於速度和內存)通常是一件壞事。 稍后我將介紹您的總體設計並解決內存/性能問題。

您正在談論的只是一個內存中的內存數據存儲。

您要求這樣做的“最佳方法”,但不指定任何條件。 好吧,建議在內存中存儲對象集合的方法只是使用數組或List<> 是的,使用LINQ遍歷它。 LINQ進行了非常好的優化,包括一些運行時優化,您的用例不太可能是這種方法太慢或使用太多內存的用例。

如果您的數據集確實很大(在這種情況下,內存中似乎是一個糟糕的選擇),並且您擔心查找時間, Dictionary<>將為您提供相當不錯的性能。

但是也許您想要的實際上是一個對象數據庫之類的東西,請考慮使用db4o 或文檔數據庫,請考慮使用RavenDb (或monogo,redis等)-Raven具有嵌入式模式,可讓您在進程中運行它。

再次,對於內存中的東西來說,這都是花哨的-即使是對於相當大的數據集,我也從未見過僅使用內置的Dictionary<>會遇到問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM