Til opgaverne herunder skal du have lidt data at arbejde med. Brug følgende array med personer og dertilhørende People-klasse.
Person[] people = new Person[]
{
new Person { Name = "Jens Hansen", Age = 45, Phone = "+4512345678" },
new Person { Name = "Jane Olsen", Age = 22, Phone = "+4543215687" },
new Person { Name = "Tor Iversen", Age = 35, Phone = "+4587654322" },
new Person { Name = "Sigurd Nielsen", Age = 31, Phone = "+4512345673" },
new Person { Name = "Viggo Nielsen", Age = 28, Phone = "+4543217846" },
new Person { Name = "Rosa Jensen", Age = 23, Phone = "+4543217846" },
};
class Person {
public string Name { get; set; }
public int Age { get; set; }
public string Phone { get; set; }
}
Herunder er en række loops der laver beregninger med people. Omskriv hvert eksempel så der ikke anvendes loops, men i stedet funktioner fra LINQ.
// Udregner den samlede alder for alle mennesker.
int totalAge = 0;
for (int i = 0; i < people.Length; i++)
{
totalAge += people[i].Age;
}
// Tæller hvor mange der hedder "Nielsen"
int countNielsen = 0;
for (int i = 0; i < people.Length; i++)
{
if (people[i].Name.Contains("Nielsen"))
{
countNielsen++;
}
}
// Find den ældste person
Person oldestPerson = null;
for (int i = 0; i < people.Length; i++)
{
if (oldestPerson == null || people[i].Age > oldestPerson.Age)
{
oldestPerson = people[i];
}
}
Med udgangspunkt i arrayet med personer, løs nedenstående delopgaver ved anvendelse af LINQ.
I denne opgave skal du lave følgende to Højere Ordens Funktioner:
var CreateWordFilterFn = (string[] words) => {
// TODO!
}
var CreateWordReplacerFn = (string[] words, string replacementWord) => {
// TODO!
}
Du skal lave dem med LINQ og uden at bruge loops.
CreateWordFilterFn: Funktionen skal returnere en ny funktion. Den nye funktion tager en tekst som input, fjerner alle ord der matcher et ord i “words”, og returnerer en tekst hvor ordene er fjernet.
CreateWordReplacerFn: Funktionen skal returnere en ny funktion. Den nye funktion tager en tekst som input, erstatter alle ord der matcher et ord i “words” med “replacementWord”, og returnerer den nye tekst.
Herunder er et eksempel på hvordan den anden funktion kan bruges:
var badWords = new string[] { "tis", "pis", "lort" };
var FilterBadWords = CreateWordReplacerFn(badWords, "kage");
Console.WriteLine(FilterBadWords("Sikke en gang lort"));
// Udskriver: "Sikke en gang kage"
Herunder er en klasse der definere en metode til at sortere et array af Person. Algoritmen der er anvendt hedder BubbleSort.
Ud over at man skal kalde Sort() med et array af Person, skal man også give den en funktion der tager to Person-objekter, og returnerer et tal svarende til om Person1 eller Person2 er størst.
public class BubbleSort
{
// Bytter om på to elementer i et array
private static void Swap(Person[] array, int i, int j)
{
Person temp = array[i];
array[i] = array[j];
array[j] = temp;
}
// Laver sortering på array med Bubble Sort.
// compareFn bruges til at sammeligne to personer med.
public static void Sort(Person[] array, Func<Person, Person, int> compareFn)
{
for (int i = array.Length - 1; i >= 0; i--)
{
for (int j = 0; j <= i - 1; j++)
{
// Laver en ombytning, hvis to personer står forkert sorteret
if (compareFn(array[j], array[j + 1]) > 0)
{
Swap(array, j, j + 1);
}
}
}
}
}
Navnet på funktions-parameteren er compareFn, og typen er Func<Person, Person, int>. Typen betyder, at compareFn er en funktion der tager to Person-objekter som input, og returnerer et tal. Tallet der returneres skal overholde følgende specifikation:
Din opgave er nu følgende:
I dagens præsentation er der et eksempel på at bruge en højere ordens funktion (“createGreeterFn”) til at genererer en ny funktion (“greetStudent”).
I denne opgave skal du lave en højere ordens funktion, som kan lave en ny udgave af BubbleSort, hvor input-parameteren compareFn er givet på forhånd. Eller sagt på en anden måde, compareFn skal være indbygget i return-funktionen, ligesom navnet på “studerende” var indbygget i “greetStudent” fra dagens slide.
Den nye version af BubbleSort skal kunne bruges på denne måde:
// Der laves en ny sorterings-funktion hvor der sammenlignes på alder
var PeopleSortAge = CreateSorter((person1, person2) => person1.Age - person2.Age);
// Den nye funktion bruges til at sortere et array
var sortedPeople = PeopleSort(people);
// Det sorterede array udskrives med LINQ så vi kan se at det virker
sortedPeople.ToList().ForEach(p => Console.WriteLine(p.Age + " " + p.Name));
Din opgave er, med andre ord, at implementere CreateSorter i ovenstående eksempel. Den skal baserer sig på koden fra sidste opgave.