2009-01-28 12 views
14

Me pregunto si existe una contraparte en java.util.LinkedHashMap en .NET? (es decir, los elementos se (re) ordenan automáticamente si tengo acceso a un elemento. (boolean accessOrder)).LinkedHashMap en .NET

+0

me gustaría entender la lógica mediante el cual simplemente accediendo a un elemento de la colección es considerada como una modificación, lo que provoca reordenación . – Cerebrus

+0

No estoy familiarizado con la clase en cuestión, pero quizás para permitir un acceso más rápido a la mayoría de los elementos a los que se accede. –

+1

Puede ver detalles sobre LinkedHashMap en http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html. Explica el uso y cuándo es útil (LRU almacena en caché). –

Respuesta

5

Un poco de Google parece mostrar que no hay un equivalente en C# incorporado para LinkedHashMap, pero hay algunas opciones de terceros disponibles.

+1

Tu enlace está roto. – user

9

Solo para aclarar un poco a los lectores: LinkedHashMap solo se comporta de esa manera cuando se construye con una sobrecarga de constructor particular. Normalmente los elementos se mantienen en orden de inserción. (Esto me parece un poco extraño, pero no importa.)

No creo que exista tal clase en .NET. No sería muy difícil construir uno, utilizando una lista de elementos vinculados y un diccionario de la clave al nodo de la lista vinculada. El acceso consistiría entonces en buscar el nodo de la lista vinculada, moverlo a la cabeza y devolver el valor.

estaría feliz para poner en práctica esta noche o mañana si quieres - (! Probar completamente una colección es una empresa que consume tiempo), aunque probablemente no con pruebas de unidad plena etc.

+1

¿Para qué sirve una clase tan extraña (que se comporta de manera diferente según ctor)? – configurator

+1

@configurator: una optimización típica para tablas hash: mueva el elemento recientemente accedido a la cabeza de su cadena; cuanto más se accede a un elemento, más rápido se encuentra. En cuanto a comportarse de manera diferente según ctor, piense que pasa un IComparer diferente a SortedList. –

+1

@Vojislav: Esto no es una "optimización típica". LinkedHashMap no mueve las entradas hacia el principio en categorías, solo recuerda cuándo se utilizó cada entrada y mueve la entrada al principio de la lista de "entradas usadas recientemente". Esto afecta solo el orden de iteración, no la velocidad de búsqueda de las siguientes búsquedas. –

2

Aquí hay un C# aplicación I encontrado en un forum:

No está documentado, pero tiene algunas pruebas. No es genérico, sin embargo. Al menos es algo que supongo.

@Jon: Te agradecería si pudieras hacer una implementación rápida. Imaginé que un Diccionario en la parte superior de una Lista Vinculada sería lo mejor, pero I hear hay problemas de recolección de basura con la Lista Vinculada que ralentiza las cosas.

+0

Problema de recolección de basura puede resolverse con grupo de nodos. Sin embargo, necesitaría una implementación de listas doblemente vinculadas. –

1

Utilicé System.Collections.Specialized.OrderedDictionary como reemplazo de LinkedHashMap. Funcionó para mí ¿Hay algo que me falta sobre OrderedDictionary (sí, no es genérico, pero está disponible con .Net 2 o más reciente)?

+1

Me parece que OrderedDictionary es diferente de LinkedHashMap de dos maneras importantes. 1) La entrada de LInkedHashMap se mueve hacia adelante después de que se leyó. Ese es el orden que está determinado por la inserción y la selección (acceso). 2) LinkedHashMap tiene un método de sobrecarga removeEldestEntry. Ambas características son valiosas si quiere construir un caché. –

0

Nhibernate tiene una implementación NHibernate.Util.LinkedHashMap.

Si ya lo tiene en su código, como yo, que puede ser útil

Cuestiones relacionadas