2011-04-28 9 views
5

Quiero construir un diccionario (clave, valor), pero quiero que este diccionario tenga un tamaño limitado, por ejemplo 1000 entradas, así que cuando tenga este tamaño límite, quiero eliminar el primero elemento y agregar un nuevo elemento (FIFO).C# Diccionario limitado

Quiero usar el diccionario, porque siempre estoy buscando las llaves en el diccionario (necesito que sea rápida)

Cómo hacer esto?

+0

Usted dice que desea eliminar el primer elemento cuando se alcanza el límite de tamaño. ¿Te refieres al primer artículo que se ingresó en el diccionario? En ese caso, tiene un comportamiento FIFO, no LIFO. ¿O desea eliminar el artículo en la posición de índice 0? La eliminación del artículo en la posición 0 no es LIFO ni FIFO. –

+0

tiene razón es fifo, sory –

+0

En ese caso, vea mi respuesta. No creo que ninguna de las otras respuestas maneje FIFO. –

Respuesta

6

Para obtener un diccionario y un comportamiento LIFO/FIFO (para eliminar la entrada más reciente/más antigua), puede usar un OrderedDictionary. Ver http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx.

Para hacer esto conveniente de usar, puede derivar su propia clase a partir del OrderedDictionary, siguiendo las líneas sugeridas por @ArsenMkrt.

Tenga en cuenta, sin embargo, que OrderedDictionary no utiliza genéricos, por lo que habrá cierta ineficacia debido al boxeo (los elementos en el diccionario se insertarán como object). La única forma de superar esto es crear una estructura de datos dual que tenga todos los elementos en el diccionario reflejados en un Queue (para FIFO), o un Stack (para LIFO). Para obtener detalles, consulte la respuesta por "Qua" a la siguiente pregunta SO, que trata precisamente de la situación en la que necesita una forma eficiente de realizar un seguimiento del orden en que se insertaron los elementos del diccionario.

Fastest and most efficient collection type in C#

3

Derivar diccionario y ovverride añadir método como este

if(myDic.Count == MAXCOUNT - 1) 
{ 
    myDic.Remove(myDic[0]); 
} 
myDic.Add(key, item); 
+0

¿Qué sucede si el elemento recién agregado obtiene el índice 0? o el elemento agregado previamente, ya que lo quitas antes de agregar? –

+0

Ese es el requisito, ¿no es así? –

+0

@ArsenMrkt No estoy seguro de cuál es el requisito. OP dice que quiere eliminar el "primer" elemento. Pero eso no es lo primero que se ingresó en el diccionario. Eliminar el elemento en la posición cero no es LIFO ni FIFO. He pedido OP para aclarar. –

0

yo no sabemos si podemos limitar el tamaño del diccionario de manera explícita. Algún tiempo atrás quise hacer lo mismo.

Resolví el problema escribiendo un método que sigue comprobando el recuento del diccionario manualmente y cuando su tamaño excedía más allá de cierto límite, eliminará algunas entradas del diccionario.