2014-03-30 31 views
1

我擁有共同的字典持有一些位圖,我已經定義如下(在VB.net):有一個字典對象只能容納幾個項目?

Private m_colImages As New ConcurrentDictionary(Of String, Bitmap) 

在此聲明我有一個功能,將項目添加到此集合類如下所示:

Public Function AddImageToCache(ByVal lensID As String, ByVal image As Bitmap) As Boolean 
    Try 
     If (m_colImages.TryAdd(lensID, image)) Then 
      Return True 
     Else 
      Return False 
     End If 
    Catch ex As Exception 
     MessageBox.Show("Unexpected exception: " & ex.Message) 
     Return False 
    End Try 
End Function 

我需要做的只是在字典中保存大約4個對象(最近的增加)。所以,如果集合中已經有4個條目並且添加了另外一個條目,我想放棄最舊的條目並將新的條目添加到字典中。但是我不會在添加時存儲時間等,所以不知道如何做到這一點。由於快速鍵/值對查找,我選擇使用字典。我沒有必要對它進行排序,等等。所以不知道我是否應該使用List而不是索引。

Picture of dictionary flow

任何幫助和代碼段將不勝感激!謝謝。

+4

您有4個項目,你害怕線性搜索將是太慢?你正在研究什麼樣的應用程序?你在做每秒數百萬次查詢嗎? – MarcinJuraszek

+1

@MarcinJuraszek - 我擔心的是應用程序是高度多線程的,一次執行大量的事情。我不想要添加什麼來影響它的性能,也是線程安全的。也許列表仍然可以使用,但我想我會問這裏。 – DataCrypt

回答

1

自定義解決方案,設置限制,最後的項目都是剩下的。

Public Class Que : Inherits ConcurrentQueue(Of QueItem) 
Public Overloads Sub Push(item As QueItem) 
    If Me.Count = 4 Then 
    Me.TryDequeue(Me.ElementAt(Me.Count - 1)) 
    MyBase.Enqueue(item) 
    Else 
    MyBase.Enqueue(item) 
    End If 
End Sub 
End Class 

Public Class QueItem 
Public Property Key As String 
Public Property Value As Image 
End Class 

用法:

Dim q As New Que 
For i As Integer = 1 To 8 
    q.Push(New QueItem With {.Key = i.ToString, .Value = {new image}) 
Next 

查詢:

Dim query = From qi As QueItem In q 
      Where qi.Key = "AB123" 
Dim img = query.FirstOrDefault.Value 
+0

考慮到OP的問題集中在'ConcurrentDictionary'上,'ConcurrentQueue'會比'Queue'更好的替代集合類型。 – J0e3gan

+0

當然,我沒有和他們混淆過...... – OneFineDay

+0

這只是從'Queue'到'ConcurrentQueue'的一個簡單的改變,但是考慮到OP的併發問題,區別是非常重要的。 – J0e3gan

相關問題