Ejemplo polimorfismo

En la clase base

 public virtual String saludo()
        {
            return "Hola "+Nombre;
        }

Clases hijas:

 public class Empleado :Persona
    {
        public int Sueldo { get; set; }
        public Empleado(String nombre)
        {
            Nombre=nombre;
        }
        public override String  saludo()
        {
            return "¡Que pasa " + Nombre;
        }
    }
 internal class Alumno:Persona
    {
        public Alumno(String nombre)
        {
            Nombre = nombre;
        }
        public override String saludo()
        {
            return "Bienvenido " + Nombre;
        }
    }

Ejemplo propiedad estática

  internal class Persona
    {
        public int Edad { get; set; }
        private static bool procesar= true; // Campo estático
        // Propiedad que tiene un campo privado asociado y que en el get o el set
        // Hacemos o comprobaciones o algo
        private string _nombre; // Campo privado para almacenar el valor de la propiedad
        public string Nombre
        {
            get => "Don/doña "+_nombre; // Descriptor de acceso get (lectura)
            set
            {
                // Descriptor de acceso set (escritura)
                if (!string.IsNullOrEmpty(value))
                {
                    this._nombre = value;
                }
            }
        }
        
        public Persona(): this("Anonimo")
        {
            
        }
        public Persona(String nombre):this(nombre,18)
        {
            
        }
        public Persona(String nombre, int edad)
        {
            Nombre = nombre;
            Edad = edad;
        }
        public void procesarOrden()
        {
            if (procesar) {
                procesar=false;
                Console.WriteLine("Procesando la orden");
            }
            else
            {
                Console.WriteLine("No puedo procesar cpu ocupada");
            }
        }
        public void acabarProceso()
        {
            procesar= true;
            Console.WriteLine("Proceso acabado");
        }
        public static String saludo()
        {
            return "Hola ";
        }
    }

En el programa

 Persona pepe = new Persona();
            Persona ana = new Persona();
            Persona juan = new Persona();

            pepe.procesarOrden();
            ana.procesarOrden();
            juan.procesarOrden();
            pepe.acabarProceso();
            ana.procesarOrden();
            juan.procesarOrden();

Ejercicio clase

Vamos a crear una clase producto con las siguientes propiedades:
String Referencia
String Nombre
int Stock
Double Precio

Vamos a crear una propiedad virtual PVP que es el precio más el iva (21%) solo de lectura
En el stock vamos a comprobar en el setter que no ponemos valores negativos

Vamos a crear un constructor con todos los datos, uno con todos los datos menos el nombre (y le pondremos como nombre la referencia) y uno solo con la referencia y el precio (en nombre pondremos la referencia y en stock 0).
Probad a crear algún producto.

Sobrecarga de constructores

En program

  Persona pepe=new Persona();
            Persona pepe1 = new Persona("Pepe");
            Persona pepe2 = new Persona("pepe",30);
 

En la clase:

 public Persona(): this("Anonimo")
        {
            
        }
        public Persona(String nombre):this(nombre,18)
        {
            
        }
        public Persona(String nombre, int edad)
        {
            Nombre = nombre;
            Edad = edad;
        }

Ejemplo clases

class Persona
    {
        // A la manera de java, creo getter y setter
        private int sueldo;
        public int getSueldo()
        {
            return sueldo;
        }
        public void setSueldo(int sueldo)
        {
            this.sueldo = sueldo;
        }

        // Propiedad sin ninguna modificación. El get y el set se hacen tal cual
        public int Edad { get; set; }

        // Propiedad que tiene un campo privado asociado y que en el get o el set
        // Hacemos o comprobaciones o algo
        private string _nombre; // Campo privado para almacenar el valor de la propiedad
        public string Nombre
        {
            get => "Don/doña "+_nombre; // Descriptor de acceso get (lectura)
            set
            {
                // Descriptor de acceso set (escritura)
                if (!string.IsNullOrEmpty(value))
                {
                    _nombre = value;
                }
            }
        }
        protected int id;
    }

Ejemplos tuplas y ejercicio

  var tuple = (1, "hello");
            Console.WriteLine(tuple);
            Console.WriteLine(tuple.Item1);
            Console.WriteLine(tuple.Item2);
            var namedTuple = (Number: 1, Message: "hello");
            Console.WriteLine(namedTuple.Number);
            Console.WriteLine(namedTuple.Message);
            int[] valores = { 1, 2, 3, 4, 5, 6, 77 };
            var res=GetMinMax(valores);
            Console.WriteLine(res.Item1 );
            Console.WriteLine(res.Item2);
            var (a, b) = res;
            Console.WriteLine(a);
            Console.WriteLine(b);
            var(min,max) = GetMinMax(valores);
            Console.WriteLine(min);
            Console.WriteLine(max);

            (max, min) = (min, max);
            Console.WriteLine(min);

            // Modificar la función pivote a la que le pasabamos una lista de números
            // y nos devuelve en formato de tupla dos listas. Una con los números
            // más pequeños que el pivote y otra con las mayores
            // pivote([1,2,3,4,5,6,7],3)=>([1,2],[4,5,6,7]
            // pivote([1,2,3,4,5,6,7],1)=>([],[2,3,4,5,6,7]
            // pivote([1,2,3,4,5,6,7],7)=>([1,2,3,4,5,6],[])
            // pivote([1,2,3,4,5,6,7],8)=>([1,2,3,4,5,6,7,8],[])

 public static (List<int>,List<int>) pivote(List<int> lista, int elemento)
{
List<int> izq=new List<int>();
List<int> der = new List<int>();
foreach(int numero in lista)
{
if (numero < elemento)
{
izq.Add(numero);
}
if (numero > elemento)
{
der.Add(numero);
}
}
return (izq, der);
}

Ejemplos hashset

 HashSet<int> numeros = new HashSet<int>();

            // Agregar elementos al HashSet
            numeros.Add(1);
            numeros.Add(2);
            numeros.Add(3);
            numeros.Add(1);
            // Iterar a través del HashSet con foreach
            foreach (int numero in numeros)
            {
                Console.WriteLine(numero);
            }
            HashSet<int> masnumeros = new HashSet<int>() { 3, 4, 5, 6 };
            numeros.SymmetricExceptWith(masnumeros);
            foreach (int numero in numeros)
            {
                Console.WriteLine(numero);
            }

            // Cread dos hashset con nombres de dos clases (clase1 y clase2)
            // Y mostrad:
            // Los nombres que estén en las dos clases
            // Los nombres de la primera clase que no están en la segunda

Ejemplos Diccionario


Dictionary&lt;string, int&gt; edades = new Dictionary&lt;string, int&gt;();

// Agregar elementos al diccionario
edades.Add("Juan", 25);
edades.Add("Ana", 30);
edades.Add("Pedro", 22);

// Acceder a elementos por clave
int edadDeJuan = edades["Juan"];
Console.WriteLine($"Edad de Juan: {edadDeJuan}");
edades["Juan"] = 90;
edadDeJuan = edades["Juan"];
Console.WriteLine($"Edad de Juan: {edadDeJuan}");
// Iterar a través del diccionario con foreach
foreach (var kvp in edades)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value} años");
}
foreach(var claves in edades.Keys)
{
Console.WriteLine(claves+"-"+ edades[claves]);
}
foreach (var valores in edades.Values)
{
Console.WriteLine(valores);
}
edades.Remove("Juan");
edades.Remove("Pepe");
foreach (var kvp in edades)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value} años");
}
if (!edades.ContainsKey("Ana"))
{
edades.Add("Ana", 40);
}
if (edades.ContainsValue(30))
{
Console.WriteLine("Hay un alumno con 30 años");
}
if (edades.TryAdd("Pep", 30))
{
Console.WriteLine("Añadida Ana");
}
else
{
Console.WriteLine("No he podido añadir a Ana");
}
int edad;
if (edades.TryGetValue("Ana",out edad))
{
Console.WriteLine("Hemos obtenido el valor");
}
else
{
Console.WriteLine("No existe el valor");
}
if (edades.TryGetValue("Pablo", out edad))
{
Console.WriteLine("Hemos obtenido el valor");
}
else
{
Console.WriteLine("No existe el valor");
}

Probad a crear un diccionaro ‘traduccion’ de cadenas como clave y cadenas como valor e introducid algunas traducciones del español al inglés (ej ‘agua’, ‘water’).
Después probad a buscar esos valores.

Mini ejercicio Queue

Random generadorAleatorio = new Random();
int numeroAleatorio = generadorAleatorio.Next(1, 101);
// Crear una fila, vamos a añadir 20 números aleatorios
// entre 1 y 100
// Y vamos a ‘procesar’ esos datos desencolando los elementos
// y haciendo lo siguiente:
// Si es par lo sumamos a una variable suma
// Si es impar lo ignoramos

Ejercicio listas

// Vamos a crear una lista de alumnos
// Vamos a añadir 10 alumnos de la siguiente manera:
// “Alumno 1”, “Alumno 2″,…,”Alumno 10″
// Vamos a borrar el alumno que esté en la posición 5
// Vamos a crear una función que nos diga si algún alumno
// tiene como subcadena la cadena que le pasemos
// existeSubcadena(alumnos,”7”)->true porque hay un “Alumno 7″
// existeSubcadena(alumnos,”27”)->false porque no subcadena “27”