Sugerencia para una busqueda

03/08/2007 - 13:15 por ANT1 | Informe spam
Hola de nuevo.

Estoy planteando como realizar un codigo de la manera mas eficiente
pero no se me ocurre bien como hacerlo.

La intencion es la siguiente:

Tengo una lista de objetos pertenecientes a la misma clase Articulos.
Cada uno de estos contiene un IList de otra clase, Proveedores.

Queria comprobar lo siguiente: comprobar que todos los articulos
tienen al menos un proveedor en comun y si tienen mas de uno mostrar
por pantalla cuales.

Habia pensado lo siguiente:

Con el primer articulo a comprobar generar una lista incial
(llamemosla ListaAuxliar) donde añadire todos los proveedores que
tenga dicho articulo. Despues comprobare uno a uno los proveedores de
ListaAuxiliar con los proveedores del segundo articulo a comprobar, si
el segundo articulo contiene al proveedor lo dejo tal cual, si no lo
contiene lo elimino de ListaAuxiliar, con lo que me quedarian los
proveedores comunes entre el articulo 1º y 2º. Despues compruebo la
ListaAuxiliar con el articulo 3º y sucesivos, con lo que al final solo
me quedarian los proveedores en comun de todos los articulos en
ListaAuxiliar.

Voy a ir haciendo esto de momento, aunque si alguien me puede
recomendar una manera mejor se lo agradecere. No termina de
convencerme demasiado.

Un saludo.

Preguntas similare

Leer las respuestas

#1 Nuno Santos
03/08/2007 - 13:49 | Informe spam
Bueno no te puedo ayudar mucho,. pero si estás a obtener las listas de una
BD, será que con una query no consigues de una la lista de proveedores
en comun?

NS

"ANT1" wrote in message
news:
Hola de nuevo.

Estoy planteando como realizar un codigo de la manera mas eficiente
pero no se me ocurre bien como hacerlo.

La intencion es la siguiente:

Tengo una lista de objetos pertenecientes a la misma clase Articulos.
Cada uno de estos contiene un IList de otra clase, Proveedores.

Queria comprobar lo siguiente: comprobar que todos los articulos
tienen al menos un proveedor en comun y si tienen mas de uno mostrar
por pantalla cuales.

Habia pensado lo siguiente:

Con el primer articulo a comprobar generar una lista incial
(llamemosla ListaAuxliar) donde añadire todos los proveedores que
tenga dicho articulo. Despues comprobare uno a uno los proveedores de
ListaAuxiliar con los proveedores del segundo articulo a comprobar, si
el segundo articulo contiene al proveedor lo dejo tal cual, si no lo
contiene lo elimino de ListaAuxiliar, con lo que me quedarian los
proveedores comunes entre el articulo 1º y 2º. Despues compruebo la
ListaAuxiliar con el articulo 3º y sucesivos, con lo que al final solo
me quedarian los proveedores en comun de todos los articulos en
ListaAuxiliar.

Voy a ir haciendo esto de momento, aunque si alguien me puede
recomendar una manera mejor se lo agradecere. No termina de
convencerme demasiado.

Un saludo.
Respuesta Responder a este mensaje
#2 ANT1
03/08/2007 - 13:54 | Informe spam
Bueno no te puedo ayudar mucho,. pero si estás a obtener las listas de una
BD, será que con una query no consigues de una la lista de proveedores
en comun?



Hola Nuno.

La verdad esa opcion ya me la habia planteado y la deseche porque
queria evitar realizar conexiones a la bd con la consiguiente perdida
de tiempo.

Pero visto lo visto lo que se complica el codigo que mencione en mi
primer comentario, es una opcion a tener en cuenta para evitar
posibles errores.

Un saludo y gracias.
Respuesta Responder a este mensaje
#3 ANT1
03/08/2007 - 17:43 | Informe spam
Comentar que he diseñado un algoritmo que realiza la operacion que
menciono en primer comentario, tras algun que otro quebradero de
cabeza. Paso el codigo por si a alguien le interesa:

public static List<Proveedor> ProveedoresComunes(List<Articulo>
listaarticulos)
{
// Lista donde meteremos inicialmente todos los
proveedores del primer articulo
List<Proveedor> listaauxiliar = new List<Proveedor>();
// Lista donde iremos añadiendo los proveedores que sean
comunes
List<Proveedor> proveedorescomunes = new
List<Proveedor>();
foreach (Proveedor p in listaarticulos[0].Proveedor)
{
listaauxiliar.Add(p); // Añadimos los proveedores
inciales
}

foreach (Proveedor p in listaauxiliar)
{
int escomun = 1;
foreach (Articulo a in listaarticulos)
{
int escomun2 = 0;
if (a.Proveedor != null)
{
foreach (Proveedor pa in a.Proveedor)
{
if (pa.CodProveedor == p.CodProveedor)
{
escomun2 = 1;
break;
}
}
escomun *= escomun2;
if (escomun == 0)
break;
}
else
{
escomun = 0;
break;
}
}
if (escomun==1)
{
proveedorescomunes.Add(p);
}
}

return proveedorescomunes;
}

Este algoritmo realiza varias pasadas sobre la misma lista de
articulos, pero no encontre mejor forma de hacerlo.

Se me ocurrio tb usar algun contador para contar el numero de veces
que aparecia cada proveedor entre todos los articulos de la lista que
se pasa, si el numero de veces que aparecia era igual al numero de
articulos es que era un proveedor comun a todos, por logica, si no no.
(He de comentar que ningun articulo puede contener mas de una vez el
mismo proveedor).

Este ultimo metodo no lo realizo de momento porque mi contrato termina
el 20 de agosto y poco tiempo tengo para terminar lo que me queda. :P
Respuesta Responder a este mensaje
#4 jcpc91
04/08/2007 - 00:12 | Informe spam
On 3 ago, 06:15, ANT1 wrote:
hola :
no entiendo muy bien lo ke kierres pero tepuedo decir algo sobre las
listas

por ejemplo las Clases List tiene un método llamado Contains() que
aceptan como parámetro un objeto del tipo que se definio en la
delclaración de la lista
ose cuando hacemos
List<mitipo> mitipo = new List<MiTipo>();

ahora bien observa este código tal veéz te ayude o te confunda pero es
lo más sencillo para saber si una lista tiene un objeto determinado
ejemplo: yo he hecho un programa que utiliza una clase llamada Color
el cual tiene un método obtener() que me regresa una lista del tipo
colores

List<Catalog.clases.Color> colores = Catalog.clases.Color.obtener(); /
*Obteniene una lista con objetos del tipo Color*/
Catalog.clases.Color color = new Color(1); /*Aqui creo un
objeto cualquiera*/
if (colores.Contains(color)) /*Aqui es lo
importante este método toma como parámetro un objeto del tipo Color y
llama automáticamente al método
equals()
que todos los objetos tienen*/
{
System.Console.WriteLine(true);
}
else
{
System.Console.WriteLine(false);
}
ahora bién la condición es que tu sobreescribas el método equals() de
tu clase yo lo hice de esta forma

public override bool Equals(object obj)
{
bool b = false;
if (obj is Color)
{
Color o = (Color)obj;
if (this.descripcion.Equals(o.descripcion) &&
this.id_color == o.id_color)
{
b = true;
}
}
return b;
}
De esta forma determino si una lista con objetos de "X" tipo contiene
el objeto tal en el parámetro
Respuesta Responder a este mensaje
#5 ANT1
06/08/2007 - 09:34 | Informe spam
Ya probe el metodo Contains para realizar esas busquedas, el problema
es que no da el resultado esperado.

Imaginate el ejemplo de una lista de objetos Persona que contenga una
relacion one-to-many a Telefono. Yo Trabajo con Castle Project y
cargando las relaciones internas a modo Lazy, cuando cargo la lista de
Personas de la BD automaticamente me carga en cada una de ellas el
primer nivel de relacion con los telefonos asociados. Por otro lado yo
puedo cargar los telefonos que contendrian el primer nivel de relacion
con personas (cada telefono su persona asociada).

Pongamos que el primer telefono de la lista de telefonos es
"telefono1", y que Persona1 (instancia de Persona) lo tiene como uno
de sus telefonos relacionados. Si hago:

if(Persona1.Telefonos.Contains(telefono1))
{
...
}

Esto a pesar de que uno contiene al otro me va a dar False. Supongo
que por las relaciones internas y el haber cargado estas en modo Lazy,
forma que no puedo cambiar ya que si no se vuelve muy lenta la
conexion con la bd cada vez que se desea trabajar con ella.

Por eso he tenido que buscarme una forma alternativa de comparar los
objetos, concretamente con el id que es unico.

Un saludo
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida