基本上我有一個Dictionary<Guid, Movie> Movies
收集和搜索電影使用Guid,這基本上是movie.Guid。它的效果很好,但我也希望能夠使用movie.Name
搜索相同的字典,而無需循環遍歷每個元素。有沒有使用密鑰搜索以多種方式搜索Dictionary的方法?
這是可能的還是我必須爲此創建另一個Dictionary<K, V>
?
基本上我有一個Dictionary<Guid, Movie> Movies
收集和搜索電影使用Guid,這基本上是movie.Guid。它的效果很好,但我也希望能夠使用movie.Name
搜索相同的字典,而無需循環遍歷每個元素。有沒有使用密鑰搜索以多種方式搜索Dictionary的方法?
這是可能的還是我必須爲此創建另一個Dictionary<K, V>
?
只有兩個字典,其中一個以guid爲關鍵字,另一個以名稱作爲關鍵字。
如果你不想看每一個元素,你需要索引它的另一個方向。這意味着另一個字典得到O(1)。
謝謝,你是如何指定它的另一個方向? –
爲了獲得O(N)中的查找,您需要一個「索引」,在這種情況下,該索引是通過字典完成的。 「在另一個方向」這個短語是描述它的一種不好的方式。 – Larsenal
謝謝Larsenal,np:O –
您可以使用值屬性進行搜索:
dictionary.Values.Where(movie => movie.Name == "Some Name")
你會失去一個基於密鑰的查找效率,但它仍然可以工作。
謝謝是啊,這是我現在正在做的,但我想O(1):O –
不,我不相信這是可能的。你將不得不使用另一個字典。
如果您要搜索更多電影屬性,您最好將數據移動到數據庫並將其用於查詢。畢竟這是數據庫的優點。
謝謝,但與數據庫,我不會得到O(1),對不對? –
數據庫將索引它,並可能做一個好工作。 – Larsenal
準確地說,你可以在你想搜索的每一列上都有一個索引,這會給你二進制搜索性能。 –
您不能使用該字典來執行相同效率的搜索。但是,您可以輕鬆地對字典的Values
屬性運行LINQ查詢,該屬性只是Movie值的集合。
var moviesIWant = From m in movieLookup.Values
Where m.Name == "Star Wars"
Select m
的幾點思考:
您可以創建另一個按名稱鍵入的字典。一旦你完成了這個任務,你就可以通過它的關鍵字來搜索這本詞典,即使是一本非常大的詞典,它也可以擁有原始詞典的超高效率。
var moviesByName = movieLookup.Values.ToDictionary(m => m.Name, m => m)
謝謝,在我的情況下,'Movie'類型具有'Guid'值,所以我仍然可以從那裏訪問它。 –
您可以在變量迭代但你ARNT得到恆定的時間在詞典中搜索值(因爲該鍵被散列的方式。)上面使用兩個dictionarys哈希引用有關答案如果你沒有太多的對象可以參考,你的對象可能是一個很好的解決方案。
由於字典是one-way
映射,您無法從值中獲取鍵。
您需要兩本詞典。
還有一個建議: 您可以使用自定義散列函數代替GUID並存儲Movie Names
散列作爲關鍵字。然後,您可以在字典中實際執行雙向搜索。
謝謝,這是一個有趣的想法。你將如何實現一個字符串散列?使用string.GetHashCode()? –
我會使用Cryptography MD5哈希類,並使用String.ToBase64()和Text.Encoding.GetBytes()方法來處理字節<-->字符串轉換。 – fardjad
謝謝,這似乎很酷。使用這些會有什麼性能開銷? –
而不是使用兩個字典,你會更好使用一個容器類,它有兩個字典裏面。
有些傢伙叫喬恩提出了部分解決了這個(你可以很容易地建立在),在這裏留下他的代碼:Getting key of value of a generic Dictionary?
謝謝,但這隻會在我的情況下提供一個'Guid'或'Movie'嗎?不是'Guid'和'Name',但非常有趣的想法。 –
啊我明白了。我以爲你想用'Guid'或'Movie'搜索。那麼在這種情況下,不完全是,但我仍然會應用相同的原則:在容器類中使用它們並在那裏封裝邏輯。 – corsiKa
謝謝,這是一個有趣的想法,我可能會實現,但'BiDictionary'很酷的方式。 –
你希望搜索在未來其他領域? – Larsenal
如果您要從數據庫填充字典,那麼在數據庫查詢中進行過濾要好得多。 – jrummell
@Larsenal,但是誰知道是否會出現問題,但不太可能。 –