Más LINQ

Con la clase Alumno

 class Alumno
{
public string Nombre { get; set; }
public int Edad { get; set; }
public double Nota { get; set; }
public Alumno(string nombre, int edad, double nota)
{
Nombre = nombre;
Edad = edad;
Nota = nota;
}
public override string ToString()
{
return Nombre+" - "+Edad+" - "+Nota;
}
}

(https://github.com/juanpablofuentes/CSharp/blob/master/LINQ/LinqBasico/LinqBasico/Alumno.cs) y los siguientes datos:


List<Alumno> listaAlumnos = new List<Alumno>()
{
new Alumno("Eva",20,6.0),
new Alumno("Ana",22,7.0),
new Alumno("Rosa",22,4.0),
new Alumno("Ot",20,3.0),
new Alumno("Iu",30,6.8),
new Alumno("Pep",32,5.9),
new Alumno("Laia",30,2.3),
new Alumno("Quim",32,1.7),
};

Crear las consultas LINQ y mostrar los datos para obtener lo siguiente:

1.- Agrupar los alumnos por edad y mostrarlos con el formato: Edad: XX, alumnos: (nombre de los alumnos)

2.- Agrupar los alumnos por aprobado/suspendido y mostrarlos con el mismo formato de antes

3.- Agrupar los alumnos por década (los de 20, los de 30…) y mostrarlos.

Tenemos la siguiente clase:


class Descuento{

public string Nombre { get; set; }

public int Decada{ get; set; }

public Descuento(string nombre, int decada) { Nombre = nombre; Decada= decada;  } public override string ToString() { return Nombre+" - "+Decada; } }

 List<Descuento> listaDescuentos = new List<Descuento>() { 
new Descuento("Jovenes",20), 
new Descuento("Profesionales",30), 
new Descuento("Tercera edad",60)
 }; 

Con estos datos haced un join entre los descuentos y los alumnos y un groupjoin para que salgan todos los descuentos.

Ejercicio Linq funciones

Vamos a crear un juego de torretas y vamos a crear la clase Torreta que tiene como propiedades:

Nombre

Posicion(x,y) struct con propiedades x e y

Rango (int)

Ataque(int)

Sería conveniente, a efectos de lo que vamos a hacer después, sobreescribir los métodos toString() Equals() y getHashCode()

Vamos a crear una lista de torretas que van a abarcar un terreno de 400×400. Tendremos un cuadrado de 4×4 torretas colocadas en las posiciones

(50,50) (150,50) (250,50)(350,50)

(50,150) (150,150) (250,150)(350,150)

(50,250) (150,250) (250,250)(350,250)

(50,350) (150,350) (250,350)(350,350)

El nombre será correlativo (Torreta1,Torreta2,…) el rango de todas es de 100 y el ataque es la suma de las coordenadas dividido por 10.

A partir de aquí:

Mostrar todas las torretas que tienen potencia de ataque superior a 50

Mostrar todas las torretas que tienen potencia de ataque superior a 50 en la primera fila

Mostrar las torretas ordenadas por ataque y después por la posición x (primera coordenada).

¿Cual es la media de ataque de todas las torretas?

¿Cual es la torreta de menos ataque?

¿Hay alguna torreta que tenga una potencia de ataque mayor de 60? (Si o no, no buscarla)

Mostrar las torretas que puedan atacar a la posición (200,200). Calcular la potencia de ataque que converge en ese punto.

Ejercicio LINQ

Con la clase Alumno

 class Alumno
{
public string Nombre { get; set; }
public int Edad { get; set; }
public double Nota { get; set; }
public Alumno(string nombre, int edad, double nota)
{
Nombre = nombre;
Edad = edad;
Nota = nota;
}
public override string ToString()
{
return Nombre+" - "+Edad+" - "+Nota;
}
}

(https://github.com/juanpablofuentes/CSharp/blob/master/LINQ/LinqBasico/LinqBasico/Alumno.cs) y los siguientes datos:


List<Alumno> listaAlumnos = new List<Alumno>()
{
new Alumno("Eva",20,6.0),
new Alumno("Ana",22,7.0),
new Alumno("Rosa",22,4.0),
new Alumno("Ot",20,3.0),
new Alumno("Iu",30,6.8),
new Alumno("Pep",32,5.9),
new Alumno("Laia",30,2.3),
new Alumno("Quim",32,1.7),
};

Crear las consultas LINQ y mostrar los datos para obtener lo siguiente:

1.- Alumnos que han aprobado mayores de 30 años.

2.- Alumno con la mejor nota

3.- Alumno más joven

4.- Media de nota del grupo

5.- Media de edad de los aprobados

 

LINQ

Una consulta es una expresión que recupera datos de un origen de datos. Las consultas se suelen expresar en un lenguaje de consultas especializado. Con el tiempo se han desarrollado diferentes lenguajes para los distintos tipos de orígenes de datos, como SQL para las bases de datos relacionales y XQuery para XML. Por lo tanto, los programadores han tenido que aprender un lenguaje de consultas nuevo para cada tipo de origen de datos o formato de datos que deben admitir. LINQ simplifica esta situación al ofrecer un modelo coherente para trabajar con los datos de varios formatos y orígenes.

https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/concepts/linq/introduction-to-linq-queries

https://www.tutorialsteacher.com/linq/what-is-linq

https://www.campusmvp.es/recursos/post/introduccion-rapida-a-linq-con-c-sharp.aspx

https://linqsamples.com/

Ejercicio eventos

Vamos a crear  una clase CuentaCorriente con un saldo privado de tipo moneda. Creamos una propiedad pública para este saldo .

Tendrá una propiedad publica credito de tipo moneda.

Creamos un delegado que no devuelve nada y tiene un parámetro moneda.

Creamos dos eventos: limite y descubierto.

En el setter del saldo si el saldo es menor o igual que el crédito se lanza el evento limite.

Si el saldo es menor que cero lanzamos el evento descubierto (y no el del límite)

Creamos una cuenta en el program y comprobamos que funcione.

Eventos

Cuando ocurre algo interesante, los eventos habilitan una clase u objeto para notificarlo a otras clases u objetos. La clase que envía (o genera) el evento recibe el nombre de publicador y las clases que reciben (o controlan) el evento se denominan suscriptores.

En una aplicación web o una aplicación de Windows Forms en C# típica, se puede suscribir a eventos generados por controles, como botones y cuadros de lista.

https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/events/

https://www.tutorialsteacher.com/csharp/csharp-event

Events in C#

Ejercicio Action, Func y Predicate

Vamos a modificar la clase ‘Fiesta’ para que en vez de utilizar que la nota sea mayor de 5 podamos ‘inyectar’ un Predicate que tomando como valor la nota nos devuelva si se añade o no.

Así mismo añadiremos un método Juego que aplicará a todos los participantes de la fiesta el método que le pasemos como parámetro que será un Action que tome un parámetro String.

Crearemos un método que tomará como parámetro una función que toma como parámetros un string y un int y devuelve un string y lo aplicará a todos los alumnos de la fiesta.

Ejercicio delegados

Vamos a crear un delegado al que le pasemos un double y devuelva un double.

Crearemos una función circunferencia que nos devuelva la circunferencia de un radio dado, una areaCirculo que nos devuelva el área de un círculo de un radio dado y otra volumenEsfera que nos devuelva el volumen de una esfera de un radio dado.

Crear una lista de double con valores (1,2,4) y un bucle que, utilizando delegados, nos imprima la circunferencia, area y volumenes.

Delegados

Un delegado es un tipo que encapsula de forma segura un método, similar a un puntero de función en C y C++. A diferencia de los punteros de función de C, los delegados están orientados a objetos, proporcionan seguridad de tipos y son seguros. El tipo de un delegado se define por el nombre del delegado.

https://docs.microsoft.com/es-es/dotnet/csharp/programming-guide/delegates/using-delegates

https://www.tutorialspoint.com/csharp/csharp_delegates.htm

https://steven-giesel.com/blogPost/aa77f7fb-41a7-47d2-8e48-ef9e101cf08e

https://www.tutorialsteacher.com/csharp/csharp-delegates

Ejercicio indexers

Vamos a reaprovechar la clase Alumno que teníamos con nombre y Nota

Crearemos una clase Fiesta que tendrá una lista de alumnos.

Vamos a tener un indexador que nos devolverá el alumno en esa posición y si asignamos nos pondrá el alumno en esa posición. Si la posición no existe lo añade al final.

Vamos a tener un indexador por string que nos busque el nombre del alumno y nos devolverá la posición del primer alumno con ese nombre.

Vamos a tener un indexador por string y nota que nos busque el nombre del alumno y nos devolverá la posición del primer alumno con ese nombre y esa nota.

En el indexador, cuando añadimos un alumno, si está suspendido no lo añadimos porque no tiene derecho a estar en la fiesta.