Använd vänsterpil och högerpil för att navigera

Eller Ctrl+P för att skriva ut till PDF (eller på papper)

Inlämning av projektarbete

Bonusföreläsningar

Föreläsning 27

Funktionell programmering i C#

Hitta alla tal större än 5

  1. var numbers = new List<int> {5, 7, 2, 4, 9};
  2. var result = new List<int> {};
  3. foreach (int x in numbers) {
  4. if (x > 5) {
  5. result.Add(x);
  6. }
  7. }

Hitta alla tal mellan 3 och 8

  1. var numbers = new List<int> {5, 7, 2, 4, 9};
  2. var result = new List<int> {};
  3. foreach (int x in numbers) {
  4. if (x > 3 && x < 8) {
  5. result.Add(x);
  6. }
  7. }

Vad skiljer sig?

  1. var numbers = new List<int> {5, 7, 2, 4, 9};
  2. var result = new List<int> {};
  3. foreach (int x in numbers) {
  4. if (booleskt uttryck) {
  5. result.Add(x);
  6. }
  7. }

Egen abstraktion

  1. public List<int> FindMatching(List<int> numbers, ... check) {
  2. var result = new List<int> {};
  3. foreach (int x in numbers) {
  4. if (check) {
  5. result.Add(x);
  6. }
  7. }
  8. return result;
  9. }

LINQ med lambda

LINQ med lambda

Where

  1. var numbers = new List<int> {5, 7, 2, 4, 9};
  2. var aboveFive = numbers.Where(x => x > 5);
  3. var betweenThreeAndEight = numbers.Where(x => x > 3 && x < 8);
  4. var even = numbers.Where(x => x % 2 == 0);
  5. var notFiveOrEight = ...;
  6. var squareAboveFifty = ...;

Egen abstraktion

  1. public List<int> FindMatching(List<int> numbers, Func<int, bool> check) {
  2. var result = new List<int> {};
  3. foreach (int x in numbers) {
  4. if (check(x)) {
  5. result.Add(x);
  6. }
  7. }
  8. return result;
  9. }

Anrop med egen abstraktion

  1. var numbers = new List<int> {5, 7, 2, 4, 9};
  2. var aboveFive = FindMatching(numbers, x => x > 5);
  3. var betweenThreeAndEight = FindMatching(numbers, x => x > 3 && x < 8);
  4. var even = FindMatching(numbers, x => x % 2 == 0);

Signaturer med generics

  1. void List.Add(int item)
  2. // "Adds an object to the end of the List<T>"
  3. int List.Find(Predicate match)
  4. // "Returns the first occurrence of an element within the entire List<T>"

Egna metoder utan generics

  1. public static int Second(int[] values) {
  2. return values[1];
  3. }
  4. public static bool Second(bool[] values) {
  5. return values[1];
  6. }
  7. public static string Second(string[] values) {
  8. return values[1];
  9. }
  10. public static ... Second(...[] values) {
  11. return values[1];
  12. }

Egen metod med generics

  1. public static T Second<T>(T[] values) {
  2. return values[1];
  3. }

FindMatching med generics

  1. public List<T> FindMatching<T>(List<T> numbers, Func<T, bool> check) {
  2. var result = new List<T> {};
  3. foreach (T x in numbers) {
  4. if (check(x)) {
  5. result.Add(x);
  6. }
  7. }
  8. return result;
  9. }

Scope med lambda

  1. public class Building {
  2. public int Temperature { get; set; }
  3. }
  4. public static void Main(string[] args) {
  5. int max = 26;
  6. int min = 18;
  7. Func<Building, bool> isHabitable =
  8. b => b.Temperature > min && b.Temperature < max;
  9. Building bld = new Building { Temperature = 15 };
  10. ShowSummary(bld, isHabitable);
  11. }
  12. public static void ShowSummary(Building bld, Func<Building, bool> check) {
  13. if (check(bld)) {
  14. Console.WriteLine("The building is OK");
  15. }
  16. else {
  17. Console.WriteLine("The building is not OK");
  18. }
  19. }