Delegados Integrados Comunes en C#
Delegados de la clase Action
Los delegados Action ecnapsulan métodos que no toman parámetros y no devuelven ningún valor.
Action: Para métodos sin parámetros y sin valor de retorno.Action<T>: Para métodos con un parámetro y sin valor de retorno.Action<T1, T2>: Para métodos con dos parámetros y sin valor de retorno.
Ejemplo de Action<T>
Imprimir elementos de una lista de enteros:
static void Main(string[] args)
{
List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };
// Usando un método anónimo con Action<int>
Action<int> imprimirElemento = delegate(int num)
{
Console.WriteLine(num);
};
numeros.ForEach(imprimirElemento);
// Usando una expresión lambda con Action<int>
Action<int> imprimirElementoLambda = (num) => Console.WriteLine(num);
numeros.ForEach(imprimirElementoLambda);
Console.ReadKey();
}
Delegados de la clase Func
Los delegados Func encapsulan métodos que pueden tomar parámetros y siempre devuelven un valor del tipo especificado.
Func<TResult>: Para métodos sin parámetros que devuelven un valor de tipoTResult.Func<T, TResult>: Para métodos con un parámetro de tipoTque devuelven un valor de tipoTResult.Func<T1, T2, TResult>: Para métodos con dos parámetros de tiposT1yT2que devuelven un valor de tipoTResult.
Ejemplo de Func<T, TResult>
Filtrar elementos de una lista de enteros mayores que 3 y mostrar los resultados:
static void Main(string[] args)
{
List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };
// Usando un método anónimo con Func<int, bool>
Func<int, bool> esMayorQueTres = delegate(int num)
{
return num > 3;
};
var listaFiltrada1 = numeros.Where(esMayorQueTres).ToList();
// Usando una expresión lambda con Func<int, bool>
Func<int, bool> esMayorQueTresLambda = num => num > 3;
var listaFiltrada2 = numeros.Where(esMayorQueTresLambda).ToList();
listaFiltrada1.ForEach(num => Console.WriteLine(num.ToString()));
listaFiltrada2.ForEach(num => Console.WriteLine(num.ToString()));
Console.ReadKey();
}
Delegado Predicate<T>
El delegado Predicate<T> representa un método que define un conjunto de condiciones y determina si un objeto especificado cumple dichas condiciones. Devuelve un valor booleano.
Ejemplo de Predicate<T>
Filtrar elementos de una lista de enteros mayores que 3:
static void Main(string[] args)
{
List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };
// Usando un método anónimo con Predicate<int>
Predicate<int> cumpleCondicion = delegate(int num)
{
return num > 3;
};
var listaFiltrada1 = numeros.FindAll(cumpleCondicion);
// Usando una expresión lambda con Predicate<int>
Predicate<int> cumpleCondicionLambda = (num) => num > 3;
var listaFiltrada2 = numeros.FindAll(cumpleCondicionLambda);
listaFiltrada1.ForEach(num => Console.WriteLine(num));
listaFiltrada2.ForEach(num => Console.WriteLine(num));
Console.ReadKey();
}
Delegado Comparison<T>
El delegado Comparison<T> representa un método que compara dos objetos del mismo tipo. Devuelve un entero que indica si el primer objeto es menor, igual o mayor que el segundo.
Ejemplo de Comparison<T>
Ordenar una lista de enteros en orden descendente:
static void Main(string[] args)
{
List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };
// Usando un método anónimo con Comparison<int> para orden descendente
Comparison<int> comparadorDesc = delegate(int a, int b)
{
return b - a; // Orden descendente
};
numeros.Sort(comparadorDesc);
numeros.ForEach(num => Console.WriteLine(num.ToString()));
// Reiniciar lista para demostración
numeros = new List<int>() { 1, 2, 3, 4, 5 };
// Usando una expresión lambda con Comparison<int> para orden descendente
Comparison<int> comparadorDescLambda = (a, b) => b - a; // Orden descendente
numeros.Sort(comparadorDescLambda);
numeros.ForEach(num => Console.WriteLine(num.ToString()));
Console.ReadKey();
}