Predikaten (Engels: Predicate) verkorten vaak het programmeerwerk omdat ze het zelf schrijven van herhalingsstructuren overbodig maken. Ze komen handig van pas bij het zoeken. In plaats van zelf lussen te schrijven, gebruik je een ingebouwde zoekmethode zoals Array.Find
of Array.FindAll
en kan je via predikaten zelf je zoekcriteria “inpluggen”.
Vanuit de logica weet je wellicht dat een predikaat is een bewering is die waar of onwaar is. In C# is een predikaat een speciale methode (een delegate) die true
of false
oplevert. Het volgende voorbeeld is een predikaat die onderzoekt of een woord een palindroom is: achterstevoren gelezen blijft het woord hetzelfde.
public bool IsPalindroom(string woord) { // omzetten naar karakterarray char[] karakters = woord.ToCharArray(); // omdraaien Array.Reverse(karakters); // opnieuw naar string omzetten string omgekeerd = new string(karakters); // vergelijken return omgekeerd == woord; }
Stel nu dat je een lijst van woorden hebt die je wil onderzoeken of het palindromen zijn:
private List<string> woordenLijst = new List<string>(); ... woordenLijst.Add("zeven"); woordenLijst.Add("lepel"); woordenLijst.Add("koekoek"); woordenLijst.Add("racecar"); woordenLijst.Add("racewagen"); woordenLijst.Add("topkookpot");
In plaats van zelf een for
-lus te schrijven en één voor één de methode toe te passen, gebruik je de Array.FindAll
-methode en voorzie je via het predikaat een zoekcriterium:
List<string> palindromen = woordenLijst.FindAll(IsPalindroom); MessageBox.Show("gevonden palindromen: " + String.Join(", ", palindromen.ToArray()));
De lus is er nu nog wel, Array.FindAll
doorloopt alle woorden en evalueert ze via het predikaat, en stopt de resultaten in een nieuwe lijst. De hoeveelheid programmeerwerk is echter afgenomen en je redeneert meer op een declaratieve manier: je denkt meer naar over “wat heb ik nodig (IsPalindroom)?” in plaats van “hoe moet ik dat programmeren (lussen)?”.