Entre esta clase, los delegados y los genéricos, estoy haciendo un código en un proyecto que tengo que en mi vida he hecho algo TAN reutilizable, estas últimas clases que he visto son oro, no sabía ni que existian estas cosas en C#, malos vicios de otros lenguajes. P.D. Gran explicación :), nunca me cansaré de decir lo bien que explicas y lo explicativos que son tus ejemplos.
hice lo de los números primos, pero con números hasta el cien, en realidad funciona hasta el número que quieras jeje, una vez más gracias por tan buenas lecciones Juan: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegados { internal class Program { static void Main(string[] args) { List numOnetoTen = new List(); for (int i = 0; i < 101; i++) { numOnetoTen.Add(i); } //Declaramos Predicado: Predicate numPares = new Predicate(returnPar); List numParesOneToTen = numOnetoTen.FindAll(returnPar); foreach (int i in numParesOneToTen) { if (i != numParesOneToTen.Last()) Console.Write(i + ", "); else Console.Write(i + "."); } Console.ReadKey(true); } static bool returnPar(int num) { int contador = 0; int divisor = 1; for (int i = 0; i < num; i++) { if (num % divisor == 0) contador++; divisor++; } if (contador == 2) return true; else return false; } } }
Pedazos de cursos estos, apenas voy por el de Java, pero estoy pendiente de todos tus aportes que algún día tambien estudiaré; definitivamente sos un dios man, creo que te quiero como familia, como mi hermano, es más creo que te quiero más que a mi familia que vive en España, tal vez un día no muy lejano ande por allá y tenga el gusto de conocerte. Saludos hermano, cuidate y muchos éxitos más...
Excelente.. Por favor ayudarnos un poco mas con C# y la cantidad de videos.. es que lo necesitamos mucho. Entiendo que no es fácil por el poco tiempo de disposición pero lo agradeceremos mucho...
Muchas gracias por sus videos he aprendido mucho. Yo hice el de los números primos apoyándome de lo que hiciste en este video solo que yo le doy la opción de dar el rango: using System; using System.Collections.Generic; namespace DelegadosPredicados { class Program { static void Main(string[] args) { // Programa para mostrar la lista de numeros primos dando el numero hasta donde quiere que se muestre: Console.WriteLine("Ingrese el numero hasta el cual quiere que se muestre los numeros primos."); int p = int.Parse(Console.ReadLine()); List listaNumeros = new List();
28/10/2020 : Gracias a tus vídeos he avanzado mucho. Tengo 31 años y hace aproximadamente un año he entrado en lleno al mundo de la programación. Faltaron las excepciones y algunos detalles: using System; using System.Collections.Generic; namespace ValidarDatos { class Programs { static void Main(string[] args) { Console.WriteLine("Introduce nombre y edad primera persona:"); Personas p1 = new Personas(); p1.Nombre = Console.ReadLine(); p1.Edad = Int32.Parse(Console.ReadLine()); Console.WriteLine("Introduce nombre y edad segunda persona:"); Personas p2 = new Personas(); p2.Nombre = Console.ReadLine(); p2.Edad = Int32.Parse(Console.ReadLine()); Console.WriteLine("Introduce nombre y edad tercera persona:"); Personas p3 = new Personas(); p3.Nombre = Console.ReadLine(); p3.Edad = Int32.Parse(Console.ReadLine()); List listadoPersonas = new List(); listadoPersonas.AddRange(new Personas[] { p1, p2, p3 }); Predicate predicadoNombre = new Predicate(fnValidarNombre); Predicate predicadoEdad = new Predicate(fnValidarEdad); bool validarNombre = listadoPersonas.Exists(predicadoNombre); if (validarNombre) Console.WriteLine("Existen personas con el nombre de El Pepe"); else Console.WriteLine("No existe persona con el nombre de Juan"); bool validarEdad = listadoPersonas.Exists(predicadoEdad); if (validarEdad) Console.WriteLine("Existen personas menores de edad"); else Console.WriteLine("No existen personas menores de edad"); } class Personas { private string nombre; private int edad; public string Nombre { get => nombre; set => nombre = value; } public int Edad { get => edad; set => edad = value; } } static bool fnValidarNombre(Personas persona) { if (persona.Nombre == "El Pepe") return true; else return false; } static bool fnValidarEdad(Personas persona) { if (persona.Edad < 18) return true; else return false; } } }
Este es mi segundo comentario con referencia a Java, pero uno hace esta comparación ya que en para usar Predicados en java tu necesitas implementar un Stream o a la lista pasarla a stream(), pero C# lo tiene un la misma interface de List
Para agregar algo en lo que se dice en el minuto 10:09, el 1 no es considerado un número primo. static bool Primos(int num) { bool bandera = false; int count = 0; for (int i = 1; i
Hola Manuel, sé que tu comentario es viejo, pero me serviría muchísimo si pudieras contestar a lo siguiente: ¿Por qué funciona si la condición if para que sean primos es true, pero retorna falso?
@@aliciabuendia872 hola alicia, la funcion esta pensada para que sea tipo boolean. Haces una llamada desde el metodo main y le das el numero que queres saber si es primo o no como parametro
Consulta, pueden agregarse más predicados por método? Por ejemplo, comprobar si existe alguien que se llama Juan y tiene más de 18 años, o si hay números primos mayores de 10. Tal vez encadenando predicados?
Hola Juan, tengo una duda, me confunde un poco que tenemos que declarar Predicate y lo que recibe es una función de tipo bool, cual es la necesidad de la clase Predicate sobre por ejemplo imaginando que los métodos .FindAll( ) y .Exist( ) recibieran una función de tipo bool directamente en lugar de un Predicate?
Predicate es un delegado que encapsula un método que toma un parámetro y devuelve un valor booleano. Esencialmente, Predicate es una definición para una función que toma un argumento de tipo T y devuelve un booleano. public delegate bool Predicate(T obj); Cuando pasas un Predicate a métodos como List.FindAll() o List.Exists(), estás pasando una función que estos métodos utilizarán para evaluar cada elemento de la lista. Podrías preguntarte, ¿por qué no sólo pasar una función booleana directamente? Bueno, técnicamente, eso es lo que estás haciendo. Predicate es esencialmente una manera de definir el tipo de esa función booleana. Decir que un método toma un Predicate es simplemente una forma de decir que toma una función que acepta un argumento de tipo T y devuelve un booleano. Hace que el código sea más claro y expresivo, porque sabes exactamente qué tipo de función necesitas pasar. Esencialmente, los delegados como Predicate, Func, Action etc., son formas en C# de tratar las funciones como objetos de primera clase, lo que significa que puedes pasar funciones como argumentos, almacenarlas en variables y así sucesivamente. Esta es una característica clave de la programación funcional. Además, Predicate añade claridad semántica. Sabes que se espera que una función que acepta un T y devuelve un bool haga una evaluación de verdad sobre T, en otras palabras, es un "predicado". ¡Saludos!
@@pildorasinformaticas Muchas gracias Juan!, "pasar funciones como argumentos", lo se hacer en javascript pero en C# por lo que veo se ocupan más pasos, solo me falta ver la parte de Unity, me agrado bastante el curso ahora que regrese a la programación, tenia 2 años sin programar luego de terminar la universidad que fue justo cuando empezó el covid-19. Creí que nunca le entendería muy bien a lenguajes como Java, pero en esta segunda vuelta con C# me agradó bastante, la forma de construir una interfaz gráfica fue mucho más intuitiva/fácil con XAML, que cuando utilicé Swing en Java durante la universidad. Anteriormente hace algunos 6 años tomé un curso de Unity, pero no sabía C#. Saludos también!
Excelente, como todo tu trabajo, Pero tengo un pregunta, se puede pasar parámetros para que no sean fijos como el de Juan y que sea dinámico a la hora de preguntar? Gracias por todo Y sigue así
Solución a los números primos que cree static bool DamePrimos(int num) { if (num < 2) return false; for (int i = 2; i < num - 1; i++) { if (num % i == 0) return false; } return true; }
osea según lo que entiendo los delegados y los predicados son referencias: delegado a metodos void o tipo de dato y predicado referencia a metodos booleanos pero lo que no entiendo es para que tendria que usar una referencia en ves de usar el metodo original? para recordarme de que es lo que hace el metodo o que?
Porque la referencia se puede pasar como argumento a otro método (en los parámetros). De esa manera se pueden crear métodos muy genéricos que aceptar como parámetro un delegado, o un predicado, o una funcion, o una accion, y luego ir llamando a este método pasándole diferentes predicados como argumentos, dependiendo del contexto y caso en que quiera usarlo. Esto permite ahorrar código y no repetir lógica. Por ejemplo supongamos que tengo un método que se llama inicializarConexion(...), y lo que hace este método es, como su nombre indica, inicializar una conexión, tiene todo un código complicado adentro, y al pasa a llamar a que se ejecute otro método o función. El tema es, que dependiendo del contexto en que quiera inicializar esa conexión, voy a querer que el método inicializarConexion ejecute una función diferente o específica después de inicializar la conexión. Entonces lo que me conviene es declararle un parámetro que sea un delegado; este delegado puede ser cualquier función o método (con una determinada firma) que yo quiera, y cada vez que llame al método inicializarConexion, lo voy a hacer pasándole diferentes funciones como argumentos.
List gente = new List { new Persona{ Nombre = "Juan", Edad = 18}, new Persona{ Nombre = "Maria", Edad = 28}, new Persona{ Nombre = "Ana", Edad = 37} };
PíldorasInformaticas necesito un pelín de ayuda en clase de informática y mates (nos da el mismo profesor) nos pidió que hiciéramos un juego RogueLike con gráficos ASCII en Phyton. Pero yo estoy perdido. Podrías hacer una serie de tutoriales haciendo un juego así ? Porfavor 😢 También nos dijo que nos descargarnos un paquete o algo así que era muy utilizado para hacer Roguelikes se llama Phyton tdl.
que gonorrea de ejercicio ! Hice un ejercicio similar con PERSONAS antes de que tu lo hicieras, patine bastante pero viejo... EXCELENTE, en este punto hay que tener los conceptos claros de todo lo que hemos visto porque si no es asi... pailas... no avanza uno.... por ahora AMIGO ENTENDI TODO E HICE UN EJERCICIO SOLO ! Muchas gracias
Siga así profesor, espero que dentro de un año lleguemos a los 200 vídeo de C#
Saludos.
Entre esta clase, los delegados y los genéricos, estoy haciendo un código en un proyecto que tengo que en mi vida he hecho algo TAN reutilizable, estas últimas clases que he visto son oro, no sabía ni que existian estas cosas en C#, malos vicios de otros lenguajes.
P.D. Gran explicación :), nunca me cansaré de decir lo bien que explicas y lo explicativos que son tus ejemplos.
Leyendo la documentación pude hacer los pases Desde el 7:55 hasta 9:25 sin haber visto antes esa parte ( aunque utilizando el for). Ya es un avance 😁
hice lo de los números primos, pero con números hasta el cien, en realidad funciona hasta el número que quieras jeje, una vez más gracias por tan buenas lecciones Juan:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegados
{
internal class Program
{
static void Main(string[] args)
{
List numOnetoTen = new List();
for (int i = 0; i < 101; i++)
{
numOnetoTen.Add(i);
}
//Declaramos Predicado:
Predicate numPares = new Predicate(returnPar);
List numParesOneToTen = numOnetoTen.FindAll(returnPar);
foreach (int i in numParesOneToTen)
{
if (i != numParesOneToTen.Last()) Console.Write(i + ", ");
else Console.Write(i + ".");
}
Console.ReadKey(true);
}
static bool returnPar(int num)
{
int contador = 0;
int divisor = 1;
for (int i = 0; i < num; i++)
{
if (num % divisor == 0) contador++;
divisor++;
}
if (contador == 2) return true;
else return false;
}
}
}
Muchas gracias por tan valioso video... en verdad explicas de lo mejor!
Pedazos de cursos estos, apenas voy por el de Java, pero estoy pendiente de todos tus aportes que algún día tambien estudiaré; definitivamente sos un dios man, creo que te quiero como familia, como mi hermano, es más creo que te quiero más que a mi familia que vive en España, tal vez un día no muy lejano ande por allá y tenga el gusto de conocerte. Saludos hermano, cuidate y muchos éxitos más...
Excelente..
Por favor ayudarnos un poco mas con C# y la cantidad de videos.. es que lo necesitamos mucho. Entiendo que no es fácil por el poco tiempo de disposición pero lo agradeceremos mucho...
Muy grande, gracias por los cursos tienes infinitamente todos mis likes 🥰
Excelentes video!
Esto es súper útil, wow Juan muchas gracias por compartirnos tu conocimiento.
Un máquina el caballero.
Muy buena explicación, saludos.
Para mejor simplicidad retornando valores bool
static bool EsPar(int num)
{
return num % 2 == 0;
}
static bool ExisteJuan(Persona persona)
{
return persona.Nombre == "Juan";
}
Excelente! Gracias mil.
Muchas gracias amigo. ¡Enseñas muy bien!
Muchas gracias por sus videos he aprendido mucho.
Yo hice el de los números primos apoyándome de lo que hiciste en este video solo que yo le doy la opción de dar el rango:
using System;
using System.Collections.Generic;
namespace DelegadosPredicados
{
class Program
{
static void Main(string[] args)
{
// Programa para mostrar la lista de numeros primos dando el numero hasta donde quiere que se muestre:
Console.WriteLine("Ingrese el numero hasta el cual quiere que se muestre los numeros primos.");
int p = int.Parse(Console.ReadLine());
List listaNumeros = new List();
for(int i = 1; i
buen vídeo, muchas gracias por el contenido
Muy buen video como siempre
28/10/2020 : Gracias a tus vídeos he avanzado mucho. Tengo 31 años y hace aproximadamente un año he entrado en lleno al mundo de la programación.
Faltaron las excepciones y algunos detalles:
using System;
using System.Collections.Generic;
namespace ValidarDatos
{
class Programs
{
static void Main(string[] args)
{
Console.WriteLine("Introduce nombre y edad primera persona:");
Personas p1 = new Personas();
p1.Nombre = Console.ReadLine();
p1.Edad = Int32.Parse(Console.ReadLine());
Console.WriteLine("Introduce nombre y edad segunda persona:");
Personas p2 = new Personas();
p2.Nombre = Console.ReadLine();
p2.Edad = Int32.Parse(Console.ReadLine());
Console.WriteLine("Introduce nombre y edad tercera persona:");
Personas p3 = new Personas();
p3.Nombre = Console.ReadLine();
p3.Edad = Int32.Parse(Console.ReadLine());
List listadoPersonas = new List();
listadoPersonas.AddRange(new Personas[] { p1, p2, p3 });
Predicate predicadoNombre = new Predicate(fnValidarNombre);
Predicate predicadoEdad = new Predicate(fnValidarEdad);
bool validarNombre = listadoPersonas.Exists(predicadoNombre);
if (validarNombre) Console.WriteLine("Existen personas con el nombre de El Pepe");
else Console.WriteLine("No existe persona con el nombre de Juan");
bool validarEdad = listadoPersonas.Exists(predicadoEdad);
if (validarEdad) Console.WriteLine("Existen personas menores de edad");
else Console.WriteLine("No existen personas menores de edad");
}
class Personas
{
private string nombre;
private int edad;
public string Nombre { get => nombre; set => nombre = value; }
public int Edad { get => edad; set => edad = value; }
}
static bool fnValidarNombre(Personas persona)
{
if (persona.Nombre == "El Pepe") return true;
else return false;
}
static bool fnValidarEdad(Personas persona)
{
if (persona.Edad < 18) return true;
else return false;
}
}
}
Ta lindo 🐱👤 el código
Este es mi segundo comentario con referencia a Java, pero uno hace esta comparación ya que en para usar Predicados en java tu necesitas implementar un Stream o a la lista pasarla a stream(), pero C# lo tiene un la misma interface de List
Muy buen video como siempre :)...Supongo que luego vendran los action y func...
Excelente clase profesor!
gracias, sigo su curso y otros más.
Para agregar algo en lo que se dice en el minuto 10:09, el 1 no es considerado un número primo.
static bool Primos(int num) {
bool bandera = false;
int count = 0;
for (int i = 1; i
Gracias !
el metodo para definir si es primo lo saque asi
for(int divisor=1 ; divisor
Hola Manuel, sé que tu comentario es viejo, pero me serviría muchísimo si pudieras contestar a lo siguiente: ¿Por qué funciona si la condición if para que sean primos es true, pero retorna falso?
@@aliciabuendia872 hola alicia, la funcion esta pensada para que sea tipo boolean. Haces una llamada desde el metodo main y le das el numero que queres saber si es primo o no como parametro
Y el metodo te responde true, si es primo o false si no lo es
@@manuelsantiagoojedaperez2180 ¡Muchas gracias!
Consulta, pueden agregarse más predicados por método? Por ejemplo, comprobar si existe alguien que se llama Juan y tiene más de 18 años, o si hay números primos mayores de 10. Tal vez encadenando predicados?
Hola profe, me gustaría saber si va a haber un vídeo sobre hilos. Gracias...
ya lo hizo
Miré la página y no hay curso tutorizado de C#. Quisiera que lo hubiera para tener ejercicios y acompañamiento del profesor. Espero lo ofrezca pronto!
El uso de predicate y findall se me hace similar al funcionamiento de filter en Javascript
10:11 pequeño detalle, el 1 no es primo
Hola Juan, tengo una duda, me confunde un poco que tenemos que declarar Predicate y lo que recibe es una función de tipo bool, cual es la necesidad de la clase Predicate sobre por ejemplo imaginando que los métodos .FindAll( ) y .Exist( ) recibieran una función de tipo bool directamente en lugar de un Predicate?
Predicate es un delegado que encapsula un método que toma un parámetro y devuelve un valor booleano. Esencialmente, Predicate es una definición para una función que toma un argumento de tipo T y devuelve un booleano.
public delegate bool Predicate(T obj);
Cuando pasas un Predicate a métodos como List.FindAll() o List.Exists(), estás pasando una función que estos métodos utilizarán para evaluar cada elemento de la lista.
Podrías preguntarte, ¿por qué no sólo pasar una función booleana directamente? Bueno, técnicamente, eso es lo que estás haciendo. Predicate es esencialmente una manera de definir el tipo de esa función booleana.
Decir que un método toma un Predicate es simplemente una forma de decir que toma una función que acepta un argumento de tipo T y devuelve un booleano. Hace que el código sea más claro y expresivo, porque sabes exactamente qué tipo de función necesitas pasar.
Esencialmente, los delegados como Predicate, Func, Action etc., son formas en C# de tratar las funciones como objetos de primera clase, lo que significa que puedes pasar funciones como argumentos, almacenarlas en variables y así sucesivamente. Esta es una característica clave de la programación funcional.
Además, Predicate añade claridad semántica. Sabes que se espera que una función que acepta un T y devuelve un bool haga una evaluación de verdad sobre T, en otras palabras, es un "predicado". ¡Saludos!
@@pildorasinformaticas Muchas gracias Juan!, "pasar funciones como argumentos", lo se hacer en javascript pero en C# por lo que veo se ocupan más pasos, solo me falta ver la parte de Unity, me agrado bastante el curso ahora que regrese a la programación, tenia 2 años sin programar luego de terminar la universidad que fue justo cuando empezó el covid-19.
Creí que nunca le entendería muy bien a lenguajes como Java, pero en esta segunda vuelta con C# me agradó bastante, la forma de construir una interfaz gráfica fue mucho más intuitiva/fácil con XAML, que cuando utilicé Swing en Java durante la universidad.
Anteriormente hace algunos 6 años tomé un curso de Unity, pero no sabía C#.
Saludos también!
Ejercicio Delegado Primo
Predicate PrimoPredicate = new Predicate(EsPrimo);
List primo = lista.FindAll(PrimoPredicate);
primo.ForEach (n =>
{
Console.WriteLine(n);
});
static bool EsPrimo(int n)
{
if (n == 1) return false;
for (int i = 1; i 1 && i < n)
{
if (n % 2 == 0) {
return false;
}
}
}
return true;
}
Excelente, como todo tu trabajo,
Pero tengo un pregunta, se puede pasar parámetros para que no sean fijos como el de Juan y que sea dinámico a la hora de preguntar?
Gracias por todo
Y sigue así
supiste si se puede?? ando viendo esa parte
@@Bola10010 hay un tipo de dato llamado dynamic, creo, ese funcionaría si es a lo que te refieres
Solución a los números primos que cree
static bool DamePrimos(int num)
{
if (num < 2) return false;
for (int i = 2; i < num - 1; i++) { if (num % i == 0) return false; }
return true;
}
Hola Juan, hay alguna forma de saber por ejemplo si existe un Juan y el tiene mas de 18 años, o solo puede evaluar a toda la lista.
Saludos
operador &&
osea según lo que entiendo los delegados y los predicados son referencias: delegado a metodos void o tipo de dato y predicado referencia a metodos booleanos pero lo que no entiendo es para que tendria que usar una referencia en ves de usar el metodo original? para recordarme de que es lo que hace el metodo o que?
Son como punteros
Porque la referencia se puede pasar como argumento a otro método (en los parámetros). De esa manera se pueden crear métodos muy genéricos que aceptar como parámetro un delegado, o un predicado, o una funcion, o una accion, y luego ir llamando a este método pasándole diferentes predicados como argumentos, dependiendo del contexto y caso en que quiera usarlo. Esto permite ahorrar código y no repetir lógica.
Por ejemplo supongamos que tengo un método que se llama inicializarConexion(...), y lo que hace este método es, como su nombre indica, inicializar una conexión, tiene todo un código complicado adentro, y al pasa a llamar a que se ejecute otro método o función. El tema es, que dependiendo del contexto en que quiera inicializar esa conexión, voy a querer que el método inicializarConexion ejecute una función diferente o específica después de inicializar la conexión. Entonces lo que me conviene es declararle un parámetro que sea un delegado; este delegado puede ser cualquier función o método (con una determinada firma) que yo quiera, y cada vez que llame al método inicializarConexion, lo voy a hacer pasándole diferentes funciones como argumentos.
porfin entiendo el tema
Se puede simplificar un poquito mas así:
static bool DamePares(int num) => num % 2 == 0;
entonces, los delegado predicado son como filtros?
copado, gracias
List gente = new List
{
new Persona{ Nombre = "Juan", Edad = 18},
new Persona{ Nombre = "Maria", Edad = 28},
new Persona{ Nombre = "Ana", Edad = 37}
};
28/10/2020
👀
Creo que tarde o temprano me voy a poner con C#
Deverias comenzar esta ciendo muy demandando .NET ahora mismo espero y no tardes mucho !
Con numero primo:
if (num == 2 || num == 3)
{
return true;
}
else if (num % 2 == 0 || num % 3 == 0)
{
return false;
}
else
{
return true;
}
PíldorasInformaticas necesito un pelín de ayuda en clase de informática y mates (nos da el mismo profesor) nos pidió que hiciéramos un juego RogueLike con gráficos ASCII en Phyton. Pero yo estoy perdido. Podrías hacer una serie de tutoriales haciendo un juego así ? Porfavor 😢
También nos dijo que nos descargarnos un paquete o algo así que era muy utilizado para hacer Roguelikes se llama Phyton tdl.
no, profe :( el uno no es primo u.u 10:10
La definición de primo es ser divisible por dos números. El uno es divisible solo por uno.
pedos y petres XD
que gonorrea de ejercicio ! Hice un ejercicio similar con PERSONAS antes de que tu lo hicieras, patine bastante pero viejo... EXCELENTE, en este punto hay que tener los conceptos claros de todo lo que hemos visto porque si no es asi... pailas... no avanza uno.... por ahora AMIGO ENTENDI TODO E HICE UN EJERCICIO SOLO ! Muchas gracias