Predicados en Find

20/11/2007 - 19:24 por Clara | Informe spam
Hola

Tengo una clase asi:
class A {
int _a;
string _b;
public A (int a, string b) {_a = a; _b = b;}
public int a {get {return _a;}}
public string b {get {return _b;}}
}

y una variable:
BindingList<A> listaA = new BindingList<A>();

Como se usa el método Find(Predicate<A>) ??
Quiero buscar en ListaA objetos de clase A en que, por ejemplo "a" sea 2;
Pero, como se le pasan los criterios de busqueda al delegado?

public bool Comparar(int comparar)
{
return comparar == ???
}

No sé si me explico.

Grácias

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
20/11/2007 - 20:43 | Informe spam
Hola Clara,

Predicate<A> representa a delegados a funciones que reciben A y devuelven
bool.

Podrías declarar en la clase donde tienes a listaA:

public bool IgualADos(A obj)
{
return obj.a == 2;
}

entonces si en el código principal pones

A elObjeto = listaA.Find(IgualADos);

la variable "elObjeto" apuntará al primer elemento de la lista que satisface
el predicado (o sea, que tiene 'a' igual a 2). En caso de que no se cumpla
la condición para ningún elemento de la lista, 'elObjeto' recibirá null.

Slds - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm



"Clara" wrote in message
news:O$bp%
Hola

Tengo una clase asi:
class A {
int _a;
string _b;
public A (int a, string b) {_a = a; _b = b;}
public int a {get {return _a;}}
public string b {get {return _b;}}
}

y una variable:
BindingList<A> listaA = new BindingList<A>();

Como se usa el método Find(Predicate<A>) ??
Quiero buscar en ListaA objetos de clase A en que, por ejemplo "a" sea 2;
Pero, como se le pasan los criterios de busqueda al delegado?

public bool Comparar(int comparar)
{
return comparar == ???
}

No sé si me explico.

Grácias




Respuesta Responder a este mensaje
#2 Clara
20/11/2007 - 21:06 | Informe spam
Hola Octavio,
Grácias.

Así, por lo que veo, la comparacion se establece siempre dentro de la
funcion.
O sea, la funcion que has puesto en el ejemplo SOLO puede comparar con "2".
Lo que pretendia era que a la funcion se le pudiera pasar uno o más valores
con los que comparar el objeto.
supongo que para hacer lo que quiero, debo declarar variables a nivel de
clase, y hacer la comparacion con éstas.

Grácias.


"Octavio Hernandez" escribió en el mensaje
news:
Hola Clara,

Predicate<A> representa a delegados a funciones que reciben A y devuelven
bool.

Podrías declarar en la clase donde tienes a listaA:

public bool IgualADos(A obj)
{
return obj.a == 2;
}

entonces si en el código principal pones

A elObjeto = listaA.Find(IgualADos);

la variable "elObjeto" apuntará al primer elemento de la lista que


satisface
el predicado (o sea, que tiene 'a' igual a 2). En caso de que no se cumpla
la condición para ningún elemento de la lista, 'elObjeto' recibirá null.

Slds - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm



"Clara" wrote in message
news:O$bp%
> Hola
>
> Tengo una clase asi:
> class A {
> int _a;
> string _b;
> public A (int a, string b) {_a = a; _b = b;}
> public int a {get {return _a;}}
> public string b {get {return _b;}}
> }
>
> y una variable:
> BindingList<A> listaA = new BindingList<A>();
>
> Como se usa el método Find(Predicate<A>) ??
> Quiero buscar en ListaA objetos de clase A en que, por ejemplo "a" sea


2;
> Pero, como se le pasan los criterios de busqueda al delegado?
>
> public bool Comparar(int comparar)
> {
> return comparar == ???
> }
>
> No sé si me explico.
>
> Grácias
>
>
>
>


Respuesta Responder a este mensaje
#3 Octavio Hernandez
21/11/2007 - 02:50 | Informe spam
Hola, Clara!

a) Puedes tener el valor a comparar en una variable externa a la función de
comparación:

private int valorAComparar = 0;
private bool compararConValor(A obj)
{
return obj.a == valorAComparar;
}

para luego hacer:

valorAComparar = 4;
A elObjeto = listaA.Find(comparaConValor);

b) Basándote en esa misma idea, puedes crearte un método genérico MyFind<A>
con un parámetro adicional:

private A MyFind<A>(ListaA lista, int valorAComparar)
{
return lista.Find<A>(
delegate (A obj) {
return obj.a == valorAComparar;
});
}

Este método utiliza un delegado anónimo y aprovecha el hecho de que éstos
pueden acceder al contexto externo (clausura).
Teniendo ese método, podrías hacer:

A elObjeto = MyFind(listaA, 4);

Saludos - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm


"Clara" wrote in message
news:
Hola Octavio,
Grácias.

Así, por lo que veo, la comparacion se establece siempre dentro de la
funcion.
O sea, la funcion que has puesto en el ejemplo SOLO puede comparar con
"2".
Lo que pretendia era que a la funcion se le pudiera pasar uno o más
valores
con los que comparar el objeto.
supongo que para hacer lo que quiero, debo declarar variables a nivel de
clase, y hacer la comparacion con éstas.

Grácias.


"Octavio Hernandez" escribió en el mensaje
news:
Hola Clara,

Predicate<A> representa a delegados a funciones que reciben A y devuelven
bool.

Podrías declarar en la clase donde tienes a listaA:

public bool IgualADos(A obj)
{
return obj.a == 2;
}

entonces si en el código principal pones

A elObjeto = listaA.Find(IgualADos);

la variable "elObjeto" apuntará al primer elemento de la lista que


satisface
el predicado (o sea, que tiene 'a' igual a 2). En caso de que no se
cumpla
la condición para ningún elemento de la lista, 'elObjeto' recibirá null.

Slds - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm



"Clara" wrote in message
news:O$bp%
> Hola
>
> Tengo una clase asi:
> class A {
> int _a;
> string _b;
> public A (int a, string b) {_a = a; _b = b;}
> public int a {get {return _a;}}
> public string b {get {return _b;}}
> }
>
> y una variable:
> BindingList<A> listaA = new BindingList<A>();
>
> Como se usa el método Find(Predicate<A>) ??
> Quiero buscar en ListaA objetos de clase A en que, por ejemplo "a" sea


2;
> Pero, como se le pasan los criterios de busqueda al delegado?
>
> public bool Comparar(int comparar)
> {
> return comparar == ???
> }
>
> No sé si me explico.
>
> Grácias
>
>
>
>






Respuesta Responder a este mensaje
#4 Clara
21/11/2007 - 16:27 | Informe spam
Grácias Octavio.
Es lo que estaba buscando.


"Octavio Hernandez" escribió en el mensaje
news:e7wXmD%
Hola, Clara!

a) Puedes tener el valor a comparar en una variable externa a la función
de comparación:

private int valorAComparar = 0;
private bool compararConValor(A obj)
{
return obj.a == valorAComparar;
}

para luego hacer:

valorAComparar = 4;
A elObjeto = listaA.Find(comparaConValor);

b) Basándote en esa misma idea, puedes crearte un método genérico
MyFind<A> con un parámetro adicional:

private A MyFind<A>(ListaA lista, int valorAComparar)
{
return lista.Find<A>(
delegate (A obj) {
return obj.a == valorAComparar;
});
}

Este método utiliza un delegado anónimo y aprovecha el hecho de que éstos
pueden acceder al contexto externo (clausura).
Teniendo ese método, podrías hacer:

A elObjeto = MyFind(listaA, 4);

Saludos - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm


"Clara" wrote in message
news:
Hola Octavio,
Grácias.

Así, por lo que veo, la comparacion se establece siempre dentro de la
funcion.
O sea, la funcion que has puesto en el ejemplo SOLO puede comparar con
"2".
Lo que pretendia era que a la funcion se le pudiera pasar uno o más
valores
con los que comparar el objeto.
supongo que para hacer lo que quiero, debo declarar variables a nivel de
clase, y hacer la comparacion con éstas.

Grácias.


"Octavio Hernandez" escribió en el
mensaje
news:
Hola Clara,

Predicate<A> representa a delegados a funciones que reciben A y
devuelven
bool.

Podrías declarar en la clase donde tienes a listaA:

public bool IgualADos(A obj)
{
return obj.a == 2;
}

entonces si en el código principal pones

A elObjeto = listaA.Find(IgualADos);

la variable "elObjeto" apuntará al primer elemento de la lista que


satisface
el predicado (o sea, que tiene 'a' igual a 2). En caso de que no se
cumpla
la condición para ningún elemento de la lista, 'elObjeto' recibirá null.

Slds - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm



"Clara" wrote in message
news:O$bp%
> Hola
>
> Tengo una clase asi:
> class A {
> int _a;
> string _b;
> public A (int a, string b) {_a = a; _b = b;}
> public int a {get {return _a;}}
> public string b {get {return _b;}}
> }
>
> y una variable:
> BindingList<A> listaA = new BindingList<A>();
>
> Como se usa el método Find(Predicate<A>) ??
> Quiero buscar en ListaA objetos de clase A en que, por ejemplo "a" sea


2;
> Pero, como se le pasan los criterios de busqueda al delegado?
>
> public bool Comparar(int comparar)
> {
> return comparar == ???
> }
>
> No sé si me explico.
>
> Grácias
>
>
>
>









Respuesta Responder a este mensaje
#5 Octavio Hernandez
21/11/2007 - 17:49 | Informe spam
Clara,

Lo único un poco "feo" que queda es que hay que llamar al método así:

A elObjeto = MyFind(listaA, 4);

en lugar de la sintaxis preferible (más OO):

A elObjeto = listaA.MyFind(4);

Puedes lograr eso:
a) si la clase listaA es tuya, haciendo que MyFind() sea miembro de la
clase.
b) si no lo es, puedes programarlo como un método extensor de C# 3.0 (ya VS
2008 está disponible)

Saludos - Octavio


Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm



"Clara" wrote in message
news:
Grácias Octavio.
Es lo que estaba buscando.


"Octavio Hernandez" escribió en el mensaje
news:e7wXmD%
Hola, Clara!

a) Puedes tener el valor a comparar en una variable externa a la función
de comparación:

private int valorAComparar = 0;
private bool compararConValor(A obj)
{
return obj.a == valorAComparar;
}

para luego hacer:

valorAComparar = 4;
A elObjeto = listaA.Find(comparaConValor);

b) Basándote en esa misma idea, puedes crearte un método genérico
MyFind<A> con un parámetro adicional:

private A MyFind<A>(ListaA lista, int valorAComparar)
{
return lista.Find<A>(
delegate (A obj) {
return obj.a == valorAComparar;
});
}

Este método utiliza un delegado anónimo y aprovecha el hecho de que éstos
pueden acceder al contexto externo (clausura).
Teniendo ese método, podrías hacer:

A elObjeto = MyFind(listaA, 4);

Saludos - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm


"Clara" wrote in message
news:
Hola Octavio,
Grácias.

Así, por lo que veo, la comparacion se establece siempre dentro de la
funcion.
O sea, la funcion que has puesto en el ejemplo SOLO puede comparar con
"2".
Lo que pretendia era que a la funcion se le pudiera pasar uno o más
valores
con los que comparar el objeto.
supongo que para hacer lo que quiero, debo declarar variables a nivel de
clase, y hacer la comparacion con éstas.

Grácias.


"Octavio Hernandez" escribió en el
mensaje
news:
Hola Clara,

Predicate<A> representa a delegados a funciones que reciben A y
devuelven
bool.

Podrías declarar en la clase donde tienes a listaA:

public bool IgualADos(A obj)
{
return obj.a == 2;
}

entonces si en el código principal pones

A elObjeto = listaA.Find(IgualADos);

la variable "elObjeto" apuntará al primer elemento de la lista que


satisface
el predicado (o sea, que tiene 'a' igual a 2). En caso de que no se
cumpla
la condición para ningún elemento de la lista, 'elObjeto' recibirá
null.

Slds - Octavio

Octavio Hernández
C# MVP
Autor de "C# 3.0 y LINQ" -
http://www.campusmvp.com/CampusMVP/...y_LINQ.htm



"Clara" wrote in message
news:O$bp%
> Hola
>
> Tengo una clase asi:
> class A {
> int _a;
> string _b;
> public A (int a, string b) {_a = a; _b = b;}
> public int a {get {return _a;}}
> public string b {get {return _b;}}
> }
>
> y una variable:
> BindingList<A> listaA = new BindingList<A>();
>
> Como se usa el método Find(Predicate<A>) ??
> Quiero buscar en ListaA objetos de clase A en que, por ejemplo "a"
> sea


2;
> Pero, como se le pasan los criterios de busqueda al delegado?
>
> public bool Comparar(int comparar)
> {
> return comparar == ???
> }
>
> No sé si me explico.
>
> Grácias
>
>
>
>













email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida