2010-03-08 9 views
10

Hice una Diccionario <string, string> colección para que pueda hacer referencia rápidamente a los artículos por su identificador de cadena.¿Cómo hacer referencia a los elementos en el diccionario <cadena, cadena> por índice entero?

Pero ahora también tienen que acceso este colectivo por índice de contador (foreach no funcionará en mi ejemplo real).

¿Qué debo hacer con la colección a continuación para que pueda acceder a sus elementos a través del índice entero también?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace TestDict92929 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<string, string> events = new Dictionary<string, string>(); 

      events.Add("first", "this is the first one"); 
      events.Add("second", "this is the second one"); 
      events.Add("third", "this is the third one"); 

      string description = events["second"]; 
      Console.WriteLine(description); 

      string description = events[1]; //error 
      Console.WriteLine(description); 
     } 
    } 
} 

Respuesta

15

No puede. Y su pregunta infiere su creencia de que Dictionary<TKey, TValue> es una lista ordenada. No lo es. Si necesita un diccionario ordenado, este tipo no es para usted.

Quizás OrderedDictionary es tu amigo. Proporciona indexación entera.

+1

exactamente lo que estaba buscando, gracias –

2

No se puede: un índice no tiene sentido porque no se ordena un diccionario, y el orden en que se devuelven los elementos cuando la enumeración puede cambiar a medida que se agregan y eliminan elementos. Necesita copiar los elementos a una lista para hacer eso.

2

Dictionary no está ordenado/ordenado, por lo que los números de índice no tendrían sentido.

+0

Lo estás pensando al revés. Piense en ello principalmente como una 'Lista', pero con métodos como Insertar, Eliminar, Indexar, pero en lugar de simplemente agregar elementos y recuperarlos a través de un indexador de enteros, puede acceder a ellos de alguna otra forma, generalmente una cadena. La clase 'DataRow' en un DataTable funciona de forma parecida a esto. – mattmc3

5

No puede. Como se dijo, un diccionario no tiene orden.

Haga su PROPIO RECIPIENTE que expone IList y IDictionary ... y administra internamente ambos (lista y diccionario). Esto es lo que hago en esos casos. Entonces, puedo usar ambos métodos.

Básicamente

class MyOwnContainer : IList, IDictionary 

y luego internamente

IList _list = xxx 
IDictionary _dictionary = xxx 

después en añadir/eliminar/cambiar ... actualizar ambos.

3

Puede usar la clase KeyedCollection<TKey, TItem> en el espacio de nombre System.Collections.ObjectModel para esto. Solo hay un gotcha: es abstracto. Así que tendrás que heredar de él y crear el tuyo propio :-). De lo contrario, use la clase no genérica OrderedDictionary.

+1

+1 para KeyedCollection –

Cuestiones relacionadas