2012-01-13 21 views
9

proceder de un entorno de desarrollo web (javascript), colecciones como diccionarios menudo se implementan como objetos debido a que sus propiedades pueden ser referenciados por asociación:.NET Diccionario vs Las propiedades de clase

// Javascript example 
var myDictionary = { 
    namevalue1 : "value1", 
    namevalue2 : "value2" 
} 

console.log(myDictionary.namevalue1); // "value1" 
console.log(myDictionary["namevalue1"]); // "value1" 

estoy escribiendo ahora y C# Me gustaría saber si la forma correcta de almacenar valores de cadena para la búsqueda es en una clase singleton o en un diccionario genérico. Me gusta que las clases estén fuertemente tipadas y que den soporte intellisense, pero anticipo muchos cambios y mantener las propiedades de la clase frente a simplemente llamar a los métodos del diccionario parece un dolor de cabeza. ¿Los beneficios de rendimiento son tan grandes que debería elegir uno sobre el otro?

+0

¿Qué tipo de cadenas? ¿Para qué los usarías? –

+0

El rendimiento suele ser la última preocupación cuando se discuten el uso de propiedades/campos en un objeto en comparación con una sola propiedad de diccionario genérico. La seguridad de tipo siempre debe considerarse más valiosa que el rendimiento en esta situación (aunque tienden a ser la misma respuesta aquí). –

+0

@James: estoy creando asignaciones de columnas para un proyecto de conversión de datos entre dos fuentes de datos cuyos nombres de columna cambian en función de la parte que genera los datos. –

Respuesta

5

De hecho, una clase sería varios órdenes de magnitud más rápida que un Dictionary. Si crees que es más conveniente, es incluso mejor :) Entonces, si puedes hacer clases para ello, hazlo. Si los objetos que representa realmente deben ser ser clases (es decir, son fundamentalmente objetos y no pares clave/valor), entonces hay más razones.

1

El C# Dictionary class está fuertemente tipado utilizando genéricos. Usted especifica tanto el tipo de las teclas como los valores cuando lo usa.

Recomiendo aprender sobre la clase de diccionario, ya que es muy probable que la encuentre útil para muchos propósitos.

Es difícil hacer más comentarios sin saber más acerca de su caso de uso, pero en general no me preocuparé por el rendimiento de la clase Dictionary hasta que sepa que es un problema, y ​​lo refactorizaré más adelante si fuera así. (Valoro valientemente que no será).

0

La clase con propiedades le dará un aumento de rendimiento y soporte intellisense. Por otro lado, el diccionario puede darte más flexibilidad, si la necesitas.

0

ya que lo está utilizando para Datos .... una "DataTable" que es una abstracción microsoft de esto, es básicamente un gran diccionario. Es posible que desee investigar DataTable, ya que tiene un montón de juguetes que pueden hacer que su vida sea mucho más fácil.

+1

DataTable es una construcción demasiado complicada e hinchada para el tipo de diseño del que está hablando. – doogle

+0

tal vez, en los comentarios ha indicado que puede estar trabajando en algo que DataTable ** podría ** ayudar con –

1

Si quiere hacer el tipo de pato que se escribe en javascript, pero en C#, puede usar ExpandoObject. Esta es una clase .NET 4. Puede configurar dinámicamente sus propiedades como:

dynamic myObject = new ExpandoObject(); 
myObject.namevalue1 = "value1"; 
myObject.namevalue2 = "value2"; 

El buen truco que viene muy bien con el ExpandoObject en referencia a lo que está tratando de hacer es que se puede acceder a las propiedades de la ExpandoObject de la misma manera como lo accederían a un valor diccionario:

var myDictionary = myObject as IDictionary<string, object>; 
Console.WriteLine(myDictionary["namevalue1"]); // value1 
Console.WriteLine(myDictionary["namevalue2"]); // value2 

Tenga en cuenta usted viene de un lenguaje dinámico (Javascript) a un lenguaje estático (C# ) y las normas y paradigmas son muy diferente. Crear una clase que represente el modelo de datos sería mucho más rápido y, en general, mejor que los objetos dinámicos.

4

Su ejemplo de JavaScript no corresponde al diccionario, así como:

var myDictionary = []; 
myDictionary["namevalue1"] = "value1"; 
myDictionary["namevalue2"] = "value2"; 

Ahora, podemos hacer todo con mi código que podemos hacer con los suyos, pero no es realmente el modelado de la misma cosa. El suyo define propiedades mientras que el mío asocia valores con claves.Has creado semánticamente un objeto estructurado, he creado un objeto más plano, aunque tengo un poco más de flexibilidad en el caso de que no sé qué cadena usaré como clave (no mucho más en js, ya que js la flexibilidad de tiempo de ejecución significa que no es demasiado duro para añadir dinámicamente nuevas propiedades si la clave es una etiqueta válida

al igual que en Javascript, en C#:.

Si usted tiene un pequeño conjunto de propiedades que se conoce en tiempo de compilación entonces, una clase con tales propiedades modela de la manera más aproximada su intención.

Si tiene un conjunto grande de propiedades o no las conoce en tiempo de compilación, entonces un diccionario modelará su intención de la manera más cercana.

El hecho de que es probable que estos sean los más efectivos en ambos casos es solo una ventaja, modele su intención lo mejor que el idioma lo permita primero, piense en alejarse de lo que más tarde si es absolutamente necesario.

No es diferente de JS realmente, excepto que es un poco más estricto en cuanto a lo que estás haciendo a la vez (podemos superar esa severidad si realmente lo necesitamos, pero ¿verdad?).

+0

+1 - Gracias por este consejo. Estoy de acuerdo con todo en su respuesta, y su implementación ciertamente más cercanamente se parece a 'Diccionario' - Acabo de imaginar que mi ejemplo se asemeja más a una clase C# y sería un poco más familiar para todos los expertos de C#. :) –

+0

Ambos serían bastante familiares, mi punto es que aunque su pregunta sugiere que el JS dado coincide con ambos enfoques de C# por igual, en realidad coincide con uno más de cerca que el otro. –

+0

Ah, ya veo lo que quieres decir. Gracias por señalar eso, no lo había pensado de esa manera, pero tienes toda la razón. –

1

Realmente depende de su caso de uso. Los diccionarios C# son mucho más efectivos de lo que generalmente espera de su código JavaScript. Además, como señala The Don, "Deberíamos olvidarnos de las pequeñas eficiencias, digamos aproximadamente el 97% del tiempo; la optimización prematura es la raíz de todo mal". He proporcionado un par de ejemplos que proporcionan el mismo resultado que el JavaScript de muestra:

enum DictKeys 
{ 
    nameValue1, 
    nameValue2, 
} 

void Main() 
{ 
    var myDictionary = new Dictionary<string, string>(); 
    myDictionary.Add("namevalue1", "value1"); 
    myDictionary.Add("namevalue2", "value2"); 

    Console.WriteLine(myDictionary["namevalue1"]); // "value1" 

    var myDict2 = new Dictionary<DictKeys, string>(); 
    myDict2.Add(DictKeys.nameValue1, "value1"); 
    myDict2.Add(DictKeys.nameValue2, "value2"); 

    Console.WriteLine(myDict2[DictKeys.nameValue1]); // "value1" 
} 
Cuestiones relacionadas