Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: seth444 en 10 de Abril de 2008, 11:03:15 AM

Título: buscando una clase en C#
Publicado por: seth444 en 10 de Abril de 2008, 11:03:15 AM
Hola, soy un novato en programación C# y quería saber si existe alguna clase en este lenguaje (C#) en la cual se me proporcione una estructura parecida a un diccionario y en cuya key pueda utilizar una lista de elementos de tipo base (por ejemplo strings).

Mi idea es utilizar esa estructura para almacenar elementos no repetitivos teniendo como key esa lista. Los elementos de ese diccionario serán objetos, que tendrán una propiedad que devuelve los datos que formarán parte de la key del objeto en el diccionario (por llamar de alguna forma a la esrtructura).

Gracias ^^ y perdonar las molestias.
Título: buscando una clase en C#
Publicado por: Warchief en 10 de Abril de 2008, 11:09:15 AM
Dictionary.
http://msdn2.microsoft.com/en-us/library/xfhwa508.aspx
Título: buscando una clase en C#
Publicado por: seth444 en 10 de Abril de 2008, 11:38:49 AM
La clase Dictionary<(Of <(TKey, TValue>)>) ya la he utilizado, pero no me vale, puesto que cuando intento insertar un nuevo objeto dentro del diccionario, tengo que ir comparando los elementos de las keys uno a uno a mano, es decir, que esta clase no me proporciona un método para hacer la comparación entre las keys que puedan haber en el diccionario y la del nuevo elemento a meter si la key es una lista.


PD: estoy mirando la clase KeyedCollection<(Of <(TKey, TItem>)>) ( http://msdn2.microsoft.com/es-es/library/ms132438.aspx ), a ver si  con ella puedo hacer lo que me propongo, sin embargo, como soy novato, no termino de enterarme bien.
Título: buscando una clase en C#
Publicado por: cyberon en 10 de Abril de 2008, 11:49:11 AM
Sí existe un método en el diccionario para comprobar que la clave existe, es el metodo "ContainsKey"


miralo aqui (http://msdn2.microsoft.com/es-es/library/kw5aaea4(VS.80).aspx)
Título: buscando una clase en C#
Publicado por: seth444 en 10 de Abril de 2008, 11:57:49 AM
Tienes razón, también lo había mirado, pero este método no da el resultado deseado si la clave que le pasas es una lista de elementos.
Título: buscando una clase en C#
Publicado por: cyberon en 10 de Abril de 2008, 12:01:23 PM
Si estás pasando una lista de elementos no te va a funcionar, ten en cuenta que las referencias a los objetos contenidos son distintos, aunque sus valores sean iguales, así que lo que tendrías que hacer es implementar un comparador de la clase contenida en la lista para que te devuelva que son iguales cuando su contenido son iguales, si no no creo que te funcione.
Título: buscando una clase en C#
Publicado por: seth444 en 10 de Abril de 2008, 12:08:35 PM
Eso es lo que hasta ahora he hecho, para salir tirando de momento.

Pero como estoy seguro que el coste de realizar toda la operación de comparación es muy mejorable, preguntaba si existía alguna clase que ya me creara esa estructura similar a un  diccionario que me permitiera tener como key una lista y que además esas comparaciones las hicera por medio de un método eficiente.

;).
Título: buscando una clase en C#
Publicado por: [EX3] en 10 de Abril de 2008, 12:19:12 PM
Cita de: seth444La clase Dictionary<(Of <(TKey, TValue>)>) ya la he utilizado, pero no me vale, puesto que cuando intento insertar un nuevo objeto dentro del diccionario, tengo que ir comparando los elementos de las keys uno a uno a mano, es decir, que esta clase no me proporciona un método para hacer la comparación entre las keys que puedan haber en el diccionario y la del nuevo elemento a meter si la key es una lista.
Emmm, a ver, no tengo el VC# instalado en la oficina para confirmartelo pero en teoria el objeto Dictionary no te va a permitir meter dos elementos con la misma clave por lo que si quieres saber si existe o no la clave podrias simplemente intentar obtener un valor con dicha clave. Si te devuelve valor es que oviamente la clave existe, de lo contrario te generara una excepcion que si la capturas puedes interpretar como que la clave no existe.
public bool function Exists(string key, Dictionary dic)
{
   try
   {
       object val = (object)dic[key].Value;
       return true;
   }
   catch(Exception ex)
   {
       return false;
   }
}

Quizas el codigo tenga alguna errata pero seria esa la idea que te comentaba.

Salu2...
Título: buscando una clase en C#
Publicado por: seth444 en 10 de Abril de 2008, 12:38:35 PM
Si, esa idea está clara, gracias ;).

Pero mi problema no es saber si una key de tipo string existe en un determinado diccionario, puesto que para eso tenemos el método ContainsKey.

Mi verdadero problema es saber si una key, que es una lista de string, está es esa estructura, cuyas keys son también listas de strings.

Como dije anteriormente, todo lo tengo implementado y funciona, mi questión es saber si exite alguna clase que me permita hacerlo y además de forma eficiente.


PD: perdonar si no termino de aclarar mi problemática, posiblemente sea por mi falta de experiencia en esto de la programación en C#.
Título: buscando una clase en C#
Publicado por: Vicente en 10 de Abril de 2008, 03:25:32 PM
Cita de: seth444Si, esa idea está clara, gracias ;).

Pero mi problema no es saber si una key de tipo string existe en un determinado diccionario, puesto que para eso tenemos el método ContainsKey.

Mi verdadero problema es saber si una key, que es una lista de string, está es esa estructura, cuyas keys son también listas de strings.

Como dije anteriormente, todo lo tengo implementado y funciona, mi questión es saber si exite alguna clase que me permita hacerlo y además de forma eficiente.


PD: perdonar si no termino de aclarar mi problemática, posiblemente sea por mi falta de experiencia en esto de la programación en C#.

Puedes o hacerte una lista especial que sea IEquatable<T> o pasarle al diccionario algo que implemente IEqualityComparer<T> (a mi me gusta más esta). No me suena que haya ninguna clase que hace lo que quieres de serie.

Un saludo,

Vicente
Título: buscando una clase en C#
Publicado por: seth444 en 11 de Abril de 2008, 09:06:42 PM
ok,  muchísimas gracias por la ayuda que me habeis ofrecido, ;).