Predicado en listas dinámicas de C#

Hola a todos, hoy os voy a explicar como podemos utilizar los predicados en algunos métodos de List de C#.

En las listas dinámicas de C#, tenemos varios métodos especiales que necesitan hacerse de una forma especial, con predicados.

Vamos a utilizar la clase Coche:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EjemploPredicados
{
    class Coche
    {

        private int _id;
        private String _marca;
        private String _modelo;
        private int _km;
        private double _precio;

        public Coche(int id, string marca, string modelo, int km, double precio)
        {
            this._id = id;
            this._marca = marca;
            this._modelo = modelo;
            this._km = km;
            this._precio = precio;
        }

        public int id { get => _id; set => _id = value; }
        public string marca { get => _marca; set => _marca = value; }
        public string modelo { get => _modelo; set => _modelo = value; }
        public int km { get => _km; set => _km = value; }
        public double precio { get => _precio; set => _precio = value; }

        public override string ToString()
        {
            return "Marca: " + marca + ", modelo: " + modelo + " con un precio de " + precio;
        }


    }
}

Vamos a crear nuestra lista y rellenarla:


// Creamos la lista
List<Coche> coches = new List<Coche>();

// Rellenamos la lista
coches.Add(new Coche(1, "SEAT", "IBIZA", 30000, 12000));
coches.Add(new Coche(2, "SEAT", "LEON", 20000, 10000));
coches.Add(new Coche(3, "AUDI", "A4", 15000, 16000));
coches.Add(new Coche(4, "HONDA", "CIVIC", 32000, 11000));
coches.Add(new Coche(5, "RENALT", "CLIO", 0, 16000));

Ahora, yo quiero buscar un elemento dentro de esta lista, lo puedo hacer con el método Find, pero es algo diferente de hacer, es lo que se llama Predicado, es algo que se hace mucho en Javascript.


Console.WriteLine("Buscando el primer coche de marca SEAT");
Coche cEncontrado = coches.Find(c => c.marca.Equals("SEAT"));
Console.WriteLine(cEncontrado);

Piensa que lo que hace al final es recorrer la lista, siendo c el elemento actual, y cuando se cumple la condición, en el caso de Find devuelve el elemento dado.

También tenemos el método Exists, es igual que el anterior pero devuelve un booleano.


Console.WriteLine("¿Existe un coche de modelo IBIZA?");
bool existeCoche = coches.Exists(c => c.modelo.Equals("IBIZA"));
Console.WriteLine("¿Coche encontrado? " + existeCoche);

Si queremos filtrar los elementos, lo podemos hacer con FindAll, en este caso filtro los coches donde su precio es mayor o igual a 12000:


List<Coche> cochesFiltrados = coches.FindAll(c => c.precio >= 12000);

También podemos recorrer como si fuera un for:


cochesFiltrados.ForEach(c => Console.WriteLine(c));

Ten en cuenta que si en cualquiera que si de estos métodos tiene mas de una linea tienes que usar {}, por ejemplo:


coches.ForEach(c => {
    if (c.precio >= 12000)
    {
        Console.WriteLine(c);
    }
});

Os dejo el ejemplo completo:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EjemploPredicados
{
    class Program
    {
        static void Main(string[] args)
        {
            // Creamos la lista
            List<Coche> coches = new List<Coche>();

            // Rellenamos la lista
            coches.Add(new Coche(1, "SEAT", "IBIZA", 30000, 12000));
            coches.Add(new Coche(2, "SEAT", "LEON", 20000, 10000));
            coches.Add(new Coche(3, "AUDI", "A4", 15000, 16000));
            coches.Add(new Coche(4, "HONDA", "CIVIC", 32000, 11000));
            coches.Add(new Coche(5, "RENALT", "CLIO", 0, 16000));

            Console.WriteLine("Buscando el primer coche de marca SEAT");
            Coche cEncontrado = coches.Find(c => c.marca.Equals("SEAT"));
            Console.WriteLine(cEncontrado);

            Console.WriteLine("¿Existe un coche de modelo IBIZA?");
            bool existeCoche = coches.Exists(c => c.modelo.Equals("IBIZA"));
            Console.WriteLine("¿Coche encontrado? " + existeCoche);

            List<Coche> cochesFiltrados = coches.FindAll(c => c.precio >= 12000);

            cochesFiltrados.ForEach(c => Console.WriteLine(c));

            coches.ForEach(c => {
                if (c.precio >= 12000)
                {
                    Console.WriteLine(c);
                }
            });


            Console.ReadLine();
        }
    }
}


Espero que os sea de ayuda. Si tenéis dudas, preguntar. Estamos para ayudarte.

Etiquetas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *