2010-11-02 21 views

Respuesta

5

Un NameValueCollection puede recuperar los elementos por el índice (pero no se puede pedir el índice de una tecla específica o elemento). Así,

var coll = new NameValueCollection(); 
coll.Add("Z", "1"); 
coll.Add("A", "2"); 
Console.WriteLine("{0} = {1}", coll.GetKey(0), coll[0]); // prints "Z = 1" 

Sin embargo, se comporta extrañamente (en comparación con un IDictionary) cuando se agrega una tecla varias veces:

var coll = new NameValueCollection(); 
coll.Add("Z", "1"); 
coll.Add("A", "2"); 
coll.Add("Z", "3"); 
Console.WriteLine(coll[0]); // prints "1,3" 

El comportamiento está bien documentado, sin embargo.

Precaución: NameValueCollection hace no implemente IDictionary.


Como acotación al margen: Dictionary<K,V> no tiene ningún índice que puede utilizar, pero siempre y cuando se agrega sólo los elementos, y nunca eliminar cualquier, el orden de los elementos es el orden de inserción. Tenga en cuenta que este es un detalle de la implementación actual de Microsoft: la documentación establece explícitamente que el orden es aleatorio, por lo que este comportamiento puede cambiar en futuras versiones de .NET Framework o Mono.

+0

Esto es genial. Una alternativa a Hashtable y Dictionary que es simple. Además, la nota sobre el orden de clasificación predeterminado de Dictionary es muy útil. –

+0

Recuerde agregar: usando System.Collections.Specialized; –

5

Si esto es algo que debe hacer un seguimiento eficiente, entonces está utilizando la estructura de datos incorrecta. En su lugar, debe usar un SortedDictionary donde la clave está etiquetada con el índice de cuándo se agregó (o una marca de tiempo) y un IComparer personalizado que compara dos claves según el índice (o la marca de tiempo).

3

¿Hay alguna Hashtable o diccionario en .NET que le permita acceder a su propiedad .Index para la entrada en el orden en que se agregó a la colección?

No. Usted puede enumarate sobre todos los elementos de una Hastable o diccionario, pero estos no son gaurenteed a estar en cualquier tipo de orden (lo más probable es que no lo son)

que tendría que o bien el uso una estructura de datos diferente por completo (como SortedDictionary u SortedList) o utilice una lista separada para almacenar el orden en el que se agregaron. Debería envolver la lista ordenada y su diccionario/hashtable en otra clase para mantenerlos sincronizados.

3

Puede usar una lista separada para almacenar los elementos en el orden en que se agregan. Algo a lo largo de las líneas del siguiente ejemplo:

public class ListedDictionary<TKey, TValue> : IDictionary<TKey, TValue> 
{ 
    List<TValue> _list = new List<TValue>(); 
    Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey,TValue>(); 

    public IEnumerable<TValue> ListedValues 
    { 
     get { return _list; } 
    } 

    public void Add(TKey key, TValue value) 
    { 
     _dictionary.Add(key, value); 
     _list.Add(value); 
    } 

    public bool ContainsKey(TKey key) 
    { 
     return _dictionary.ContainsKey(key); 
    } 

    public ICollection<TKey> Keys { get { return _dictionary.Keys; } } 

    public bool Remove(TKey key) 
    { 
     _list.Remove(_dictionary[key]); 
     return _dictionary.Remove(key); 
    } 

    // further interface methods... 
} 
1

Una alternativa es crear una serie de Construcciones, por lo que en lugar de utilizar

dictionary.Add{"key1","value1"} 

se crea una estructura con la clave/valor, como:

public struct myStruct{ 
    private string _sKey; 
    public string sKey{ 
     get { return _sKey; } 
     set { _sKey = value; } 
    } 
    private string _sValue; 
    public string sValue { 
     get { return _sValue; } 
     set { _sValue = value; } 
    } 
} 

// create list here 
List<myStruct> myList = new List<myStruct>(); 

// create an instance of the structure to add to the list 
myStruct item = new myStruct(); 
item.sKey = "key1"; 
item.sValue = "value1"; 

// then add the structure to the list 
myList.Add(item); 

Usando este método se puede añadir el suplemento dimensiones a la lista sin demasiado esfuerzo, simplemente agregue un nuevo miembro en la estructura.

Tenga en cuenta que si necesita modificar los elementos en la lista después de que se han agregado, tendrá que cambiar la estructura en una clase. Consulte esta página para obtener más información sobre este tema: error changing value of structure in a list

2

Eche un vistazo a la clase OrderedDictionary. No solo puede acceder a él mediante claves, sino también a través de un índice (posición).

Cuestiones relacionadas