2011-09-13 17 views
5

Estoy usando una lista para almacenar un par de valores hexadecimales (por ejemplo, en la lista AD38F2D8, que se muestra como: Valor_A: AD 38 F2 D8).C# dictionary o simplemente sigue usando listas?

Mi pregunta es si debo usar Dictionary<string, string> o debería usar Dictionary<string, NewCustomObject> para almacenar la cadena hexadecimal como un par de cadenas. (Valor: [AD, 38, F2, D8]) en lugar de (Valor: AD38F2D8).

Probablemente no hará una gran diferencia entre los dos.

Con Dictionary<string, string> Solo almacenaría cada cadena hexadecimal en el diccionario, y luego los dividiría en sus respectivos pares cuando los necesite. si utilizo el Dictionary<string, NewCustomObject> terminaría primero dividiendo las cadenas hexagonales en sus pares respectivos y luego las almacenaría en el diccionario.

Mi pregunta es ¿qué debo usar? ¿O debería seguir usando listas?

No es del todo necesario para mí usar Dictionary<string, string> ya que aún sabría en qué índice está la cuerda, solo que se vería mejor. ejemplo

lista:

Index = 0, Value = 3D95FF08 
Index = 1, Value = 8D932A08 

Dictionary<string, string> ejemplo:

Index = 0, Key = First, Value = 3D95FF08 
Index = 1, Key = Second, Value = 8D932A08 

Dictionary<string, NewCustomObject> ejemplo:

Index = 0, Key = First, Value = 3D, 95, FF, 08 
Index = 1, Key = Second, Value = 8D, 93, 2A, 08 

NOTA: el valor del índice en cada ejemplo diccionario es sólo para mostrar la corespondence a los otros, sé que un diccionario no tiene valores de índice bu t usa claves en su lugar. simplemente hace que sea más fácil mirar este ejemplo.

Encontré la última cadena de diccionario aquí: C# Dictionary with two Values per Key? Estaba buscándolo porque ya lo he usado varias veces mientras escribía el código python. almacenando una lista de cadenas dentro de un diccionario.

¡Gracias de antemano por cualquier ayuda!

EDITAR

Cada cadena, ya sea en la lista o diccionario, se dividirían en sus respectivos bytes. EG.

BYTE 0 1 2 3 to 6 ..... 
HEX AD 12 01 0000859D ..... 

Byte 0 sostendría el Índice Byte 1 sostendría la referencia Byte 2 las Banderas Byte 3 a 6: El Memb_Number_ID

Por lo tanto, si yo los separé antes incluso poner estos en el diccionario No tengo que hacerlo antes de usarlos en su lugar respectivo ya que tendría que dividirlos para calcular el índice, la referencia y los indicadores.

La base de datos me fue dada en este formato, estoy forzado a trabajar con ella de la manera que es actualmente, así que no puedo cambiarla. y solo puedo adaptar mi código a este.

anterior ejemplo sería emitido en forma de:

Index Reference Link Flags   Memb_Number_ID 
173  18    +A    John (ID: 34205) 
+1

¿Por qué piensas en cambiar a Diccionario? ¿No está funcionando el código con las listas? –

+0

Si nos informa cómo va a utilizar la colección, alguien le proporcionará una muestra del código junto con una recomendación. Por el momento, solo nos ha dicho lo que está almacenando, no cómo va a acceder más tarde. –

+0

El código con las listas está funcionando bien, solo estoy buscando una forma de hacerlo más fácil de trabajar. cada valor hexadecimal se almacena en la base de datos como 1 cadena, pero como se explicó anteriormente, cada conjunto de caracteres dentro de esa cadena tiene su propio significado, por lo que ponerlo en un diccionario con los pares de división podría facilitar las cosas, para mostrar la información. – Raskaroth

Respuesta

4

Diccionarios no exponga índices, que no tienen el concepto. Me quedo con una lista:

List<NewCustomObject> myHexValues;

Y si es necesario buscar a través de ella, se puede utilizar LINQ. Solo use diccionarios si necesita acceso rápido basado en una clave definida.

No ha declarado realmente cómo piensa utilizar la colección, por lo que nadie puede decirle realmente que use una u otra: estoy adivinando basándome en el hecho de que quiere valores de índice.

Actualización: si quieres un acceso más fácil a los elementos del valor hexadecimal, puede utilizar un rectangular array o envuelva el valor de un tipo personalizado y exponer las propiedades de las diferentes partes (su elección en struct vs class, depende en los valores, supongo), y luego pegue ese tipo en una lista.

Si usted hace su propio tipo, puede expose an indexer si desea obtener la siguiente sintaxis:

myCustomType[indexKey] = value;

+0

en realidad el índice está allí para mostrar las correspondencias a la lista. No necesito los índices. es cualquiera de los dos valores myhex [0] o myhexvalues ​​[1]. o el respectivo método de los diccionarios – Raskaroth

+0

@Raskaroth ¿cómo quieres usar la colección? Ignore por un momento qué colección usará finalmente. ¿Desea sacar o iterar información clave? –

+0

Si quiere "indexarlos", como en, usar un valor que no es la "clave" del diccionario, entonces no puede, necesita usar índices. –

0

Si necesita dos (o más) valores asociados entre sí, un Tuple es Que necesitas. Un diccionario es innecesario porque no está utilizando uno de los valores como una búsqueda (clave) ... ¿verdad?

Según lo que creo que es su situación, diría que una colección (la lista funciona bien) de Tuples.

Además, ¿por qué está almacenando un valor hexadecimal como una cadena? Puede dejarlo como un número entero y usar String.Format({0:X}, value); para mostrarlo como una Cadena hexadecimal.

+0

Porque inicialmente se almacena en la base de datos como un binario, y uso un método explicado aquí: http://stackoverflow.com/questions/6640898/c-asp-net-show-binary-data-from-database. Esto es más o menos la continuación de ese código, justo ahora que lo estoy dividiendo para trabajar más con él. funciona, pero estoy buscando una forma más eficiente. – Raskaroth

+0

y no, no estoy usando la clave para buscar el valor, no necesariamente tengo que hacerlo. Olvidé sobre la tupla, gracias por el recordatorio! – Raskaroth

+0

Tupple no funcionaría, ya que los valores hexadecimales se almacenan uno después del otro, por lo tanto, si tengo 8 cadenas almacenadas en esa base de datos, y cada cadena contiene 8 pares de valores hexadecimales. entonces tendría un tupple de: 8 * (8 * 2) = 128 valores. Y mi base de datos almacena 80 cadenas de caracteres hexadecimales en un valor de base de datos, ¿imagina qué tan grande sería ese tupple? o necesitaría crear 80 tupple individuales con 8 pares de valores hexadecimales en ellos. – Raskaroth

0

¿Por qué no analizar la cadena hexagonal inmediatamente después de obtenerla en un objeto real? Ha demostrado cómo se ve el objeto (con el índice, los enlaces de referencia, etc.). Personalmente lo analizaría directamente en un objeto Record (o algo así) y luego los almacenaría en una lista. De esta forma, es mucho más fácil consultarlos y tener un formato más intuitivo que almacenar una cadena hexadecimal o una matriz de cadenas hexagonales o lo que sea ...

+0

La cosa es 1 cadena hexadecimal de la base de datos contiene 80 cadenas, que contienen 8 pares. es por eso que necesito algo más fácil de usar. – Raskaroth

Cuestiones relacionadas