2014-03-30 32 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

相关问题