Pregunta

Así que últimamente he estado husmeando un poco con C# y todas las colecciones genéricas me tienen un poco confundido.Digamos que quería representar una estructura de datos donde la cabeza de un árbol era un par clave-valor, y luego hay una lista opcional de pares clave-valor debajo (pero no más niveles que estos).¿Sería esto adecuado?

public class TokenTree
{
    public TokenTree()
    {
        /* I must admit to not fully understanding this,
         * I got it from msdn. As far as I can tell, IDictionary is an
         * interface, and Dictionary is the default implementation of
         * that interface, right?
         */
        SubPairs = new Dictionary<string, string>();
    }

    public string Key;
    public string Value;
    public IDictionary<string, string> SubPairs;
}

En realidad, es sólo una simple derivación para transmitir datos.

¿Fue útil?

Solución

Hay un tipo de datos real llamado KeyValuePair, utilícelo así

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");

Otros consejos

Una posible cosa que podría hacer es utilizar el objeto Diccionario directamente y luego ampliarlo con sus propias modificaciones:

public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

Esto le brinda la ventaja de no tener que aplicar las reglas de IDictionary para su clave (por ejemplo, unicidad de clave, etc.).

Y sí, entendiste bien el concepto del constructor :)

Creo que lo que podría estar buscando (como una implementación literal de su pregunta) es:

public class TokenTree
{
    public TokenTree()
    {
        tree = new Dictionary<string, IDictionary<string,string>>();
    }

    IDictionary<string, IDictionary<string, string>> tree; 
}

De hecho, dijiste una "lista" de valores-clave en tu pregunta, por lo que es posible que desees intercambiar el interior IDictionary con un:

IList<KeyValuePair<string, string>>

Hay un tipo incorporado KeyValuePair.De hecho, esto es a lo que el IDictionary le da acceso cuando lo itera.

Además, esta estructura no es un árbol, por lo que encontrar un nombre más representativo podría ser un buen ejercicio.

Sólo una cosa que añadir a esto (aunque creo que otros ya han respondido a tu pregunta).En aras de la extensibilidad (ya que todos sabemos que sucederá en algún momento), es posible que desee consultar el Patrón compuesto Esto es ideal para trabajar con "Estructuras tipo árbol".

Como dije, sé que solo esperas un subnivel, pero esto podría ser realmente útil para ti si luego necesitas ampliar ^_^

@Jay Luna:Una clase de diccionario genérica en .NET es en realidad una tabla hash, solo que con tipos fijos.

El código que ha mostrado no debería convencer a nadie de usar Hashtable en lugar de Dictionary, ya que ambos fragmentos de código se pueden usar para ambos tipos.

Para tabla hash:

foreach(object key in h.keys)
{
     string keyAsString = key.ToString(); // btw, this is unnecessary
     string valAsString = h[key].ToString();

     System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}

Para diccionario:

foreach(string key in d.keys)
{
     string valAsString = d[key].ToString();

     System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}

Y lo mismo para el otro con KeyValuePair, solo usa la versión no genérica para Hashtable y la versión genérica para Dictionary.

Entonces, es igual de fácil en ambos sentidos, pero Hashtable usa Objeto tanto para la clave como para el valor, lo que significa que encuadrará todos los tipos de valores y no tendrá seguridad de tipos, y Diccionario usa tipos genéricos y, por lo tanto, es mejor.

Clase de diccionario es exactamente lo que quieres, correcto.

Puede declarar el campo directamente como Diccionario, en lugar de IDictionary, pero eso depende de usted.

Utilice algo como esto:

class Tree < T > : Dictionary < T, IList< Tree < T > > >  
{  
}  

Es feo, pero creo que te dará lo que quieres.Lástima que KeyValuePair esté sellado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top