17 Lambda Delegates Linq PDF
17 Lambda Delegates Linq PDF
Programação Orientada a
Objetos + Projetos
Capítulo: Expressões lambda, delegates e LINQ
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Comparison<T> (System)
https://msdn.microsoft.com/en-us/library/tfakywbh(v=vs.110).aspx
https://github.com/acenelio/lambda1-csharp
• Orientado a objetos (C++, Object Pascal, Java (< 8), C# (< 3))
• Lógico (Prolog)
Programação Programação
Imperativa Funcional
comandos expressões
Como se descreve algo a ser computado (*)
("como" - imperativa) ("o quê" - declarativa)
Funções possuem transparência referencial
fraco forte
(ausência de efeitos colaterais)
Objetos imutáveis (*) raro comum
Funções são objetos de primeira ordem não sim
Expressividade / código conciso baixa alta
Inferência de tipos raro comum
Execução tardia (lazy) raro comum
Transparência referencial
Uma função possui transparência referencial se seu resultado for sempre o mesmo
para os mesmos dados de entrada. Benefícios: simplicidade e previsibilidade.
using System;
namespace Course {
class Program {
Isso significa que funções podem, por exemplo, serem passadas como parâmetros de
métodos, bem como retornadas como resultado de métodos.
class Program {
list.Sort(CompareProducts);
(...)
Inferência de tipos
int sum = 0;
foreach (int x in list) {
sum += x;
}
vs.
int sum = list.Aggregate(0, (x, y) => x + y);
O que são "expressões lambda"?
Em programação funcional, expressão lambda corresponde a uma
função anônima de primeira classe.
class Program {
(...)
list.Sort(CompareProducts);
(...)
Resumo da aula
Delegates
• https://docs.microsoft.com/en-us/dotnet/standard/delegates-lambdas
• Usos comuns:
• Comunicação entre objetos de forma flexível e extensível (eventos / callbacks)
• Parametrização de operações por métodos (programação funcional)
Delegates pré-definidos
• Action
• Func
• Predicate
Demo
namespace Course.Services {
class CalculationService {
namespace Course {
class Program {
static void Main(string[] args) {
double a = 10;
double b = 12;
// BinaryNumericOperation op = CalculationService.Sum;
BinaryNumericOperation op = new BinaryNumericOperation(CalculationService.Sum);
Multicast delegates
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Multicast delegates
• Delegates que guardam a referência para mais de um método
Demo
using System;
namespace Course.Services {
class CalculationService {
namespace Course {
class Program {
static void Main(string[] args) {
double a = 10;
double b = 12;
BinaryNumericOperation op = CalculationService.ShowSum;
op += CalculationService.ShowMax;
op(a, b);
}
}
}
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, remova da
lista somente aqueles cujo preço mínimo seja 100.
https://github.com/acenelio/lambda2-csharp
Action (exemplo com ForEach)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Action (System)
• Representa um método void que recebe zero ou mais argumentos
• https://msdn.microsoft.com/en-us/library/system.action%28v=vs.110%29.aspx
https://github.com/acenelio/lambda3-csharp
(16 sobrecargas)
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, gere uma
nova lista contendo os nomes dos produtos em caixa alta.
https://github.com/acenelio/lambda4-csharp
Nota sobre a função Select
• A função "Select" (pertencente ao LINQ) é uma função que aplica
uma função a todos elementos de uma coleção, gerando assim uma
nova coleção (do tipo IEnumerable).
4 6 8
• ForEach(Action)
• Select(Func)
Problema exemplo
Fazer um programa que, a partir de uma lista de produtos, calcule a
soma dos preços somente dos produtos cujo nome começa com "T".
https://github.com/acenelio/lambda5-csharp
Introdução ao LINQ
http://educandoweb.com.br
Prof. Dr. Nelio Alves
• Namespace: System.Linq
• Referência:
• https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/index
Três passos
• Criar um data source (coleção, array, recurso de E/S, etc.)
• Definir a query
• Executar a query (foreach ou alguma operação terminal)
Demo
// Specify the data source.
int[] numbers = new int[] { 2, 3, 4, 5 };
Operações do LINQ
• Filtering: Where, OfType • Grouping: GroupBy
• https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b/view/SamplePack/2?sortBy=Popularity
• https://odetocode.com/articles/739.aspx
https://github.com/acenelio/linq-demo1
Nivelamento:
Álgebra Relacional e SQL
http://educandoweb.com.br
Prof. Dr. Nelio Alves
CATEGORY
ID NAME TIER
1 Tools 2
2 Computers 1
3 Electronics 1
PRODUCT
ID NAME PRICE CATEGORY_ID
1 Computer 1100.0 2
2 Hammer 90.0 1
3 TV 1700.0 3
4 Notebook 1300.0 2
Operações básicas da álgebra relacional
• Restrição
• Projeção
• Produto cartesiano
SELECT *
FROM PRODUCT, CATEGORY
ID NAME PRICE CATEGORY_ID ID NAME TIER ID NAME PRICE CATEGORY_ID ID NAME TIER
1 Computer 1100.0 2 1 Tools 2 2 Hammer 90.0 1 1 Tools 2
2 Hammer 90.0 1 1 Tools 2 1 Computer 1100.0 2 2 Computers 1
3 TV 1700.0 3 1 Tools 2 4 Notebook 1300.0 2 2 Computers 1
4 Notebook 1300.0 2 1 Tools 2 3 TV 1700.0 3 3 Electronics 1
1 Computer 1100.0 2 2 Computers 1
2 Hammer 90.0 1 2 Computers 1
3 TV 1700.0 3 2 Computers 1
4 Notebook 1300.0 2 2 Computers 1
1 Computer 1100.0 2 3 Electronics 1
2 Hammer 90.0 1 3 Electronics 1
3 TV 1700.0 3 3 Electronics 1
4 Notebook 1300.0 2 3 Electronics 1
Operação "restrição":
SELECT *
FROM PRODUCT
INNER JOIN CATEGORY cat ON PRODUCT.CATEGORY_ID = cat.ID
WHERE CATEGORY.NAME = 'Computers'
ID NAME PRICE CATEGORY_ID ID NAME TIER ID NAME PRICE CATEGORY_ID ID NAME TIER
1 Computer 1100.0 2 1 Tools 2 2 Hammer 90.0 1 1 Tools 2
2 Hammer 90.0 1 1 Tools 2 1 Computer 1100.0 2 2 Computers 1
3 TV 1700.0 3 1 Tools 2 4 Notebook 1300.0 2 2 Computers 1
4 Notebook 1300.0 2 1 Tools 2 3 TV 1700.0 3 3 Electronics 1
1 Computer 1100.0 2 2 Computers 1
2 Hammer 90.0 1 2 Computers 1
3 TV 1700.0 3 2 Computers 1
4 Notebook 1300.0 2 2 Computers 1 ID NAME PRICE CATEGORY_ID ID NAME TIER
1 Computer 1100.0 2 3 Electronics 1 1 Computer 1100.0 2 2 Computers 1
2 Hammer 90.0 1 3 Electronics 1 4 Notebook 1300.0 2 2 Computers 1
3 TV 1700.0 3 3 Electronics 1
4 Notebook 1300.0 2 3 Electronics 1
Operação "projeção":
SELECT PRODUCT.*, CATEGORY.NAME
FROM PRODUCT
INNER JOIN CATEGORY cat ON PRODUCT.CATEGORY_ID = cat.ID
WHERE CATEGORY.NAME = 'Computers'
ID NAME PRICE CATEGORY_ID ID NAME TIER ID NAME PRICE CATEGORY_ID ID NAME TIER
1 Computer 1100.0 2 1 Tools 2 2 Hammer 90.0 1 1 Tools 2
2 Hammer 90.0 1 1 Tools 2 1 Computer 1100.0 2 2 Computers 1
3 TV 1700.0 3 1 Tools 2 4 Notebook 1300.0 2 2 Computers 1
4 Notebook 1300.0 2 1 Tools 2 3 TV 1700.0 3 3 Electronics 1
1 Computer 1100.0 2 2 Computers 1
2 Hammer 90.0 1 2 Computers 1
3 TV 1700.0 3 2 Computers 1
4 Notebook 1300.0 2 2 Computers 1 ID NAME PRICE CATEGORY_ID ID NAME TIER
1 Computer 1100.0 2 3 Electronics 1 1 Computer 1100.0 2 2 Computers 1
2 Hammer 90.0 1 3 Electronics 1 4 Notebook 1300.0 2 2 Computers 1
3 TV 1700.0 3 3 Electronics 1
4 Notebook 1300.0 2 3 Electronics 1
Exercício resolvido
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Fazer um programa para ler um conjunto de produtos a partir de um
arquivo em formato .csv (suponha que exista pelo menos um produto).
https://github.com/acenelio/lambda6-csharp
Input file:
Tv,900.00
Mouse,50.00
Tablet,350.50
HD Case,80.90
Computer,850.00
Monitor,290.00
Execution:
Enter full file path: c:\temp\in.txt
Average price: 420.23
Tablet
Mouse
Monitor
HD Case
https://github.com/acenelio/lambda6-csharp
Exercício de fixação
http://educandoweb.com.br
Prof. Dr. Nelio Alves
https://github.com/acenelio/lambda7-csharp
Input file:
Maria,[email protected],3200.00
Alex,[email protected],1900.00
Marco,[email protected],1700.00
Bob,[email protected],3500.00
Anna,[email protected],2800.00
Execution:
Enter full file path: c:\temp\in.txt
Enter salary: 2000.00
Email of people whose salary is more than 2000.00:
[email protected]
[email protected]
[email protected]
Sum of salary of people whose name starts with 'M': 4900.00
https://github.com/acenelio/lambda7-csharp