Matriz asociativa C #

He estado usando un Hashtable, pero por naturaleza, los hashtables no están ordenados, y necesito mantener todo en orden mientras los agrego (porque quiero sacarlos en el mismo orden). Por ejemplo si lo hago:

pages["date"] = new FreeDateControl("Date:", false, true, false); pages["plaintiff"] = new FreeTextboxControl("Primary Plaintiff:", true, true, false); pages["loaned"] = new FreeTextboxControl("Amount Loaned:", true, true, false); pages["witness"] = new FreeTextboxControl("EKFG Witness:", true, true, false); 

Y cuando hago un foreach quiero poder obtenerlo en el orden de:

 pages["date"] pages["plaintiff"] pages["loaned"] pages["witness"] 

¿Cómo puedo hacer esto?

Creo que .NET tiene la clase OrderedDictionary para lidiar con esto. No es genérico, pero puede servir como un sustituto Hashtable decente, si no le importa la seguridad de tipo estricto.

He escrito un contenedor genérico alrededor de esta clase, que estaría dispuesto a compartir.

http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx

EDITAR: LBushkin tiene razón – OrderedDictionary parece que hace el truco, aunque de una manera no genérica. Es curioso cuántas colecciones especializadas hay que no tienen equivalentes generics 🙁 (Tendría sentido para Malfist cambiar la respuesta aceptada a LBushkin).

(Pensé que …) .NET no tiene nada incorporado para hacer esto.

Básicamente, deberá mantener una List así como un Dictionary . Cuando agrega al diccionario, agregue la clave a la lista. Luego puede recorrer la lista y encontrar las claves en orden de inserción. Sin embargo, tendrás que tener cuidado al eliminar o reemplazar elementos.

No hay una solución perfecta antes de .NET 4.0. En <3.5 puedes:

Utilice una SortedList genérica con tipo de clave de entero y tipo de valor del tipo común más derivado de sus elementos. Defina un valor entero (i, digamos) y a medida que agregue cada elemento a la lista ordenada, cree la clave i ++, incrementando su valor a medida que avanza. Más tarde, itere sobre la propiedad GetValueList de la lista ordenada. Esta propiedad de IList proporcionará sus objetos en el orden en que los puso, porque se ordenarán por la clave que usó.

Esto no es rápido, sino bastante bueno y genérico. Si también desea acceder por clave, necesita hacer otra cosa, pero no veo eso en sus requisitos. Si no es nuevo para recuperar por clave, y agrega elementos en orden de claves para que la colección no tenga que hacer su clasificación, aquí está.

En .NET 4.0 tendrás el SortedSet Of T genérico, que será absolutamente perfecto para ti. No hay concesiones.

use la lista ordenada Creo que resolverá su problema porque el objeto SortedList mantiene internamente dos matrices para almacenar los elementos de la lista; es decir, una matriz para las claves y otra matriz para los valores asociados. Cada elemento es un par de clave / valor al que se puede acceder como un objeto DictionaryEntry

SortedList sl = new SortedList ();

foreach (DictionaryEntry x en sl) {}

Usa el KeyedCollection

Su base subyacente es una Lista pero proporciona una búsqueda de diccionario basada en clave. En este caso tu clave son las cuerdas. Entonces, siempre y cuando no esté agregando la misma clave dos veces, estará bien.

http://msdn.microsoft.com/en-us/library/ms132438.aspx

Como sugiere Haxelit, puede derivar de KeyedCollection . En realidad, utiliza una Lista debajo hasta que alcanza un cierto valor de umbral, y luego mantiene una Lista y un Diccionario. Si puede usar una función para derivar una de sus claves de uno de sus valores, entonces esta es una solución fácil. Si no, entonces se vuelve bastante desordenado.

La mejor manera es usar los indexadores de C #. Es configurable para cualquier cosa que nos guste. Podemos pasar un int , enum , long , double o cualquier cosa que nos guste.

Solo tiene que crear una clase y asignarle indexadores y configurar los parámetros de entrada y salida. Es un poco más de trabajo, pero creo que esta es la única manera correcta.

Consulte este enlace de MSDN para obtener más información sobre cómo usarlo.

Una alternativa es mantener sus valores clave ordenados en una estructura ordenada como una Lista, el rest aún se almacena en un diccionario.

Luego, cuando necesite acceder a sus datos, simplemente revise su Lista ordenada y consulte su diccionario en el camino.