2011-10-14 58 views
2

基本上我有一個Dictionary<Guid, Movie> Movies收集和搜索電影使用Guid,這基本上是movie.Guid。它的效果很好,但我也希望能夠使用movie.Name搜索相同的字典,而無需循環遍歷每個元素。有沒有使用密鑰搜索以多種方式搜索Dictionary的方法?

這是可能的還是我必須爲此創建另一個Dictionary<K, V>

+0

你希望搜索在未來其他領域? – Larsenal

+0

如果您要從數據庫填充字典,那麼在數據庫查詢中進行過濾要好得多。 – jrummell

+0

@Larsenal,但是誰知道是否會出現問題,但不太可能。 –

回答

3

只有兩個字典,其中一個以guid爲關鍵字,另一個以名稱作爲關鍵字。

1

如果你不想看每一個元素,你需要索引它的另一個方向。這意味着另一個字典得到O(1)

+0

謝謝,你是如何指定它的另一個方向? –

+0

爲了獲得O(N)中的查找,您需要一個「索引」,在這種情況下,該索引是通過字典完成的。 「在另一個方向」這個短語是描述它的一種不好的方式。 – Larsenal

+0

謝謝Larsenal,np:O –

1

您可以使用值屬性進行搜索:

dictionary.Values.Where(movie => movie.Name == "Some Name") 

你會失去一個基於密鑰的查找效率,但它仍然可以工作。

+0

謝謝是啊,這是我現在正在做的,但我想O(1):O –

0

不,我不相信這是可能的。你將不得不使用另一個字典。

如果您要搜索更多電影屬性,您最好將數據移動到數據庫並將其用於查詢。畢竟這是數據庫的優點。

+0

謝謝,但與數據庫,我不會得到O(1),對不對? –

+1

數據庫將索引它,並可能做一個好工作。 – Larsenal

+0

準確地說,你可以在你想搜索的每一列上都有一個索引,這會給你二進制搜索性能。 –

1

您不能使用該字典來執行相同效率的搜索。但是,您可以輕鬆地對字典的Values屬性運行LINQ查詢,該屬性只是Movie值的集合。

var moviesIWant = From m in movieLookup.Values 
        Where m.Name == "Star Wars" 
        Select m 

的幾點思考:

  • 當你雖然找到答案,你會不會的GUID,除非他們也是電影的屬性。
  • 對於一個小字典,這很好。對於大量重複搜索,您應該考慮創建其他字典,並將其鍵入您希望搜索的其他值。只有這樣,你才能實現與原始字典相媲美的guid查詢速度。

您可以創建另一個按名稱鍵入的字典。一旦你完成了這個任務,你就可以通過它的關鍵字來搜索這本詞典,即使是一本非常大的詞典,它也可以擁有原始詞典的超高效率。

var moviesByName = movieLookup.Values.ToDictionary(m => m.Name, m => m) 
+0

謝謝,在我的情況下,'Movie'類型具有'Guid'值,所以我仍然可以從那裏訪問它。 –

1

您可以在變量迭代但你ARNT得到恆定的時間在詞典中搜索值(因爲該鍵被散列的方式。)上面使用兩個dictionarys哈希引用有關答案如果你沒有太多的對象可以參考,你的對象可能是一個很好的解決方案。

1

由於字典是one-way映射,您無法從值中獲取鍵。

您需要兩本詞典。

還有一個建議: 您可以使用自定義散列函數代替GUID並存儲Movie Names散列作爲關鍵字。然後,您可以在字典中實際執行雙向搜索。

+0

謝謝,這是一個有趣的想法。你將如何實現一個字符串散列?使用string.GetHashCode()? –

+0

我會使用Cryptography MD5哈希類,並使用String.ToBase64()和Text.Encoding.GetBytes()方法來處理字節<-->字符串轉換。 – fardjad

+0

謝謝,這似乎很酷。使用這些會有什麼性能開銷? –

1

而不是使用兩個字典,你會更好使用一個容器類,它有兩個字典裏面。

有些傢伙叫喬恩提出了部分解決了這個(你可以很容易地建立在),在這裏留下他的代碼:Getting key of value of a generic Dictionary?

+0

謝謝,但這隻會在我的情況下提供一個'Guid'或'Movie'嗎?不是'Guid'和'Name',但非常有趣的想法。 –

+0

啊我明白了。我以爲你想用'Guid'或'Movie'搜索。那麼在這種情況下,不完全是,但我仍然會應用相同的原則:在容器類中使用它們並在那裏封裝邏輯。 – corsiKa

+0

謝謝,這是一個有趣的想法,我可能會實現,但'BiDictionary'很酷的方式。 –

相關問題