sirve - struct c#
¿La mejor implementación para la estructura de datos de pares de valores clave? (8)
@ Jay Mooney : una clase de diccionario genérica en .NET es en realidad una tabla hash, solo con tipos fijos.
El código que ha mostrado no debe convencer a nadie de usar Hashtable en lugar de Dictionary, ya que ambos fragmentos de código se pueden usar para ambos tipos.
Para hashtable:
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 use la versión no genérica para Hashtable y la versión genérica para Dictionary.
Por lo tanto, es igual de fácil en ambos sentidos, pero Hashtable utiliza Object para clave y valor, lo que significa que va a encapsular todos los tipos de valor, y no tiene seguridad de tipos, y Dictionary usa tipos genéricos y es, por lo tanto, mejor.
Así que he estado hurgando un poco con C # últimamente, y todas las Colecciones Genéricas me tienen un poco confundido. Digamos que quería representar una estructura de datos donde el jefe de un árbol era un par de valores clave, y luego hay una lista opcional de pares clave de valores debajo de eso (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;
}
Es solo una derivación simple para pasar datos.
Creo que lo que podrías estar buscando (como una implementación literal de tu pregunta) es:
public class TokenTree
{
public TokenTree()
{
tree = new Dictionary<string, IDictionary<string,string>>();
}
IDictionary<string, IDictionary<string, string>> tree;
}
En realidad, dijo una "lista" de IDictionary
clave-valor en su pregunta, por lo que es posible que desee cambiar el IDictionary
interno por un:
IList<KeyValuePair<string, string>>
Hay un tipo de datos real llamado KeyValuePair, use así
KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
Hay un tipo incorporado KeyValuePair. De hecho, esto es a lo que IDictionary le da acceso cuando itera en él.
Además, esta estructura no es un árbol, encontrar un nombre más representativo podría ser un buen ejercicio.
Solo una cosa para agregar a esto (aunque creo que otros ya le han respondido su pregunta). En aras de la extensibilidad (ya que todos sabemos que sucederá en algún momento) es posible que desee verificar el Patrón compuesto. Esto es ideal para trabajar con "Estructuras similares a un árbol".
Como dije, sé que solo estás esperando un subnivel, pero esto podría ser útil para ti si luego necesitas extender ^ _ ^
Una cosa posible que podría hacer es usar el objeto Dictionary directamente y luego extenderlo con sus propias modificaciones:
public class TokenTree : Dictionary<string, string>
{
public IDictionary<string, string> SubPairs;
}
Esto le da la ventaja de no tener que aplicar las reglas de IDictionary para su clave (por ejemplo, unicidad de clave, etc.).
Y sí, tienes el concepto del constructor correcto :)
Usa algo como esto:
class Tree < T > : Dictionary < T, IList< Tree < T > > >
{
}
Es feo, pero creo que te dará lo que quieras. Lástima que KeyValuePair esté sellado.
Clase de diccionario es exactamente lo que quieres, correcto.
Puede declarar el campo directamente como Dictionary, en lugar de IDictionary, pero eso depende de usted.