2010-06-21 17 views
10

Si tiene el siguiente código. Donde veas el XXX me gustaría poner un array de tipo long [].C# ¿Cómo puedo definir un diccionario que contenga diferentes tipos?

¿Cómo puedo hacer esto y cómo recuperar valores del diccionario? ¿Solo uso defaultAmbience ["CountryId"] [0] para obtener el primer elemento?

public static Dictionary<string, object> defaultAmbience = new Dictionary<string, object> 
{ 
    { "UserId", "99999" }, 
    { "CountryId", XXX }, 
    { "NameDefaultText", "nametext" }, 
    { "NameCulture", "it-IT" }, 
    { "NameText", "namelangtext" }, 
    { "DescriptionDefaultText", "desctext" }, 
    { "DescriptionCulture", "it-IT" }, 
    { "DescriptionText", "desclangtext" }, 
    { "CheckInUsed", "" } 
}; 
+7

¿Has probado tu código? –

+2

Tal vez deberías usar una clase o una estructura. – mbillard

+0

¿Está lidiando con datos ldap o ldif por casualidad? – Jubal

Respuesta

8

En primer lugar:

Si no conoce el tipo del valor o la tecla, entonces no use el diccionario genérico.

.NET Los genéricos son más adecuados para cuando conoce los tipos con anticipación. .NET también proporciona un conjunto completo de colecciones para usar cuando desee almacenar un "paquete mixto" de objetos de diferentes tipos.

En este caso, el equivalente del diccionario sería el HashTable.

Consulte el espacio de nombres System.Collections (en lugar de System.Collections.Generic) para ver el resto de las opciones que tiene.

Si conoce el tipo de clave, entonces lo que está haciendo es la manera correcta.

En segundo lugar:

Cuando retreive el valor ... usted va a necesitar para convertir el objeto de vuelta a su tipo original:

long[] countryIds = (long[]) defaultAmbience["CountryId"]; 

o

// To get the first value 
long id = ((long[])defaultAmbience["CountryId"])[0]; 
+6

El uso de tipos no genéricos no va a ayudar aquí realmente, todavía necesita hacer el molde, etc. Y sabe que las claves van a ser cadenas, por lo que en realidad obtiene algún beneficio del uso de versiones genéricas. – Grzenio

+3

¿Qué pasa con 'Dictionary '? Para mí eso muestra mucho más claro el intento de almacenar artículos mezclados. Además, evita que intente utilizar una clave que no sea de cadena (consulte también http://stackoverflow.com/questions/1433713/which-collection-class-to-use-hashtable-or-dictionary/1433736#1433736) –

+0

@ 0xA3 - Nada. Actualicé mi respuesta. Lo que está haciendo ahora está bien, siempre y cuando sepa el tipo de clave. –

2

Tendrás que proporcionar el reparto donde lo llames.

((long[])defaultAmbience["countryID"])[0]; 
1

En este caso C# no sabe realmente qué tipo que espera obtener, así que hay que echar al tipo correcto después de tomarla del diccionario y antes de que lo utilice. En el caso de este arreglo largo esto sería:

((long[])defaultAmbience["CountryId"])[0] 
Cuestiones relacionadas