openxava ejemplos downloads demos .net dictionary priority-queue multimap

.net - ejemplos - ¿Hay alguna alternativa a Dictionary/SortedList que permita duplicados?



openxava ejemplos (7)

Posible duplicado:
C # colección ordenable que permite duplicar claves

Básicamente, me gustaría hacer que un diccionario funcione con claves duplicadas sin entrar en implementaciones de comparadores personalizados. Hay una idea de:

Dictionary<key, List<value>>

pero todavía tiene algunos gastos generales. Ojalá Dictionary tuviera "AllowDuplicates".



No en Fx <3.5. Puede implementar uno, obviamente, con un diccionario de objetos IList. Pero luego tienes el problema / responsabilidad de encapsulación.

Si usa .NET 3.5, use la clase de búsqueda .


Por definición, un diccionario contiene claves únicas. Su ejemplo anterior es efectivamente una especie de matriz con dos dimensiones, una estructura que he usado muchas veces. ¿Por qué querrías tener llaves duplicadas? Si lo hiciera, ¿cómo abordaría el Diccionario de forma exclusiva sus miembros?


Si está usando .NET 3.5, entonces Lookup es probablemente lo que está buscando.


Me encontré con el mismo problema ... Necesitaba una lista ordenada que permitiera la duplicación de claves.

var sortList = new SortedList<string, IDictionary<string, object>>();

pero esto no funcionó ... así que usé

var list = new List<KeyValuePair<string, IDictionary<string, object>>>();

agregar nuevos datos a él como ...

list.Add(new KeyValuePair<string, IDictionary<string, object>>>(value, Dictionary));

con linq lo ordené sin problema ...

Pruebe List<KeyValuePair<TKey, List<TValue>>>();


Aún puede usar SortedList e intentar crear una clave única combinando su valor y un Guid en una clase. En este caso, debe implementar IComparer<NewKey> para su nueva clave, algo así como:

class MyKey { public Guid Guid { get; set; } public float Value { get; set; } } class MyComparer : IComparer<MyKey> { public int Compare(MyKey x, MyKey y) { if (x == null || y == null) throw new InvalidOperationException("both of parameters must be not null"); if (x.Value < y.Value) return -1; if (x.Value > y.Value) return 1; return 0; } }

y entonces

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());


Eso no funciona. Tan pronto como devuelva 0 del comparador, emitirá una excepción "duplicada".

No necesita encapsulación de clases ni nada, simplemente haga un comparador que no devuelva 0 (igual) resultado. Aquí hay un ejemplo para el tipo de clave int

class MyComparer : IComparer<int> { public int Compare(int x, int y) { if (x < y) return -1; else return 1; } }