Delegates and Lambdas
Predicate Filter
A predicate delegate returns true or false for each value.
predicate
A predicate is a function that answers a yes-or-no question.
Predicate Filter
PredicateFilter.cs
Replay: real traced execution (multi-file project)
using System;
class Program
{
static void Main()
{
int minimum = 3;
int[] values = { 1, 3, 5, 7 };
Func<int, bool> keep = value => value >= minimum;
int kept = 0;
int total = 0;
foreach (int value in values)
{
if (keep(value))
{
kept++;
total += value;
}
}
Console.WriteLine($"minimum={minimum}");
Console.WriteLine($"kept={kept}");
Console.WriteLine($"total={total}");
}
}
using System;
class Program
{
static void Main()
{
int minimum = 2;
int[] values = { 1, 3, 5, 7 };
Func<int, bool> keep = value => value >= minimum;
int kept = 0;
int total = 0;
foreach (int value in values)
{
if (keep(value))
{
kept++;
total += value;
}
}
Console.WriteLine($"minimum={minimum}");
Console.WriteLine($"kept={kept}");
Console.WriteLine($"total={total}");
}
}
using System;
class Program
{
static void Main()
{
int minimum = 5;
int[] values = { 1, 3, 5, 7 };
Func<int, bool> keep = value => value >= minimum;
int kept = 0;
int total = 0;
foreach (int value in values)
{
if (keep(value))
{
kept++;
total += value;
}
}
Console.WriteLine($"minimum={minimum}");
Console.WriteLine($"kept={kept}");
Console.WriteLine($"total={total}");
}
}
minimum ← 3, keep ← System.Func`2[System.Int32,System.Boolean]
4{5 static void Main()6 {7 int minimum→ 3 = 3; //@minimum=2, 58 int[] values = { 1, 3, 5, 7 };9 Func<int, bool> keep→ System.Func`2[System.Int32,System.Boolean] = value => value >= minimum;10 int kept→ 0 = 0;11 int total→ 0 = 0;foreach (int value in values)
pass 1 of 413foreach (int value1 in values)14{15 if (keep(value))All 4 passes — pass 1 is the card above pass value1 1 2 3 3 5 4 7 kept ← 1, total ← 3
pass 1 of 314{15 if (keep(value3))16 {17 kept→ 1++;18 total→ 3 += value3;19 }All 3 passes — pass 1 is the card above pass valuekepttotal1 3 0 → 1 3 2 5 1 → 2 8 3 7 2 → 3 15 Console.WriteLine($"minimum={minimum}");
22 Console.WriteLine($"minimum={minimum3}");23 Console.WriteLine($"kept={kept3}");24 Console.WriteLine($"total={total15}");25}outputminimum=3 kept=3 total=15
minimum ← 2, keep ← System.Func`2[System.Int32,System.Boolean]
4{5 static void Main()6 {7 int minimum→ 2 = 2;8 int[] values = { 1, 3, 5, 7 };9 Func<int, bool> keep→ System.Func`2[System.Int32,System.Boolean] = value => value >= minimum;10 int kept→ 0 = 0;11 int total→ 0 = 0;foreach (int value in values)
pass 1 of 413foreach (int value1 in values)14{15 if (keep(value))All 4 passes — pass 1 is the card above pass value1 1 2 3 3 5 4 7 kept ← 1, total ← 3
pass 1 of 314{15 if (keep(value3))16 {17 kept→ 1++;18 total→ 3 += value3;19 }All 3 passes — pass 1 is the card above pass valuekepttotal1 3 0 → 1 3 2 5 1 → 2 8 3 7 2 → 3 15 Console.WriteLine($"minimum={minimum}");
22 Console.WriteLine($"minimum={minimum2}");23 Console.WriteLine($"kept={kept3}");24 Console.WriteLine($"total={total15}");25}outputminimum=2 kept=3 total=15
minimum ← 5, keep ← System.Func`2[System.Int32,System.Boolean]
4{5 static void Main()6 {7 int minimum→ 5 = 5;8 int[] values = { 1, 3, 5, 7 };9 Func<int, bool> keep→ System.Func`2[System.Int32,System.Boolean] = value => value >= minimum;10 int kept→ 0 = 0;11 int total→ 0 = 0;foreach (int value in values)
pass 1 of 413foreach (int value1 in values)14{15 if (keep(value))All 4 passes — pass 1 is the card above pass valuekepttotal1 1 — — 2 3 — — 3 5 0 → 1 5 4 7 1 → 2 12 kept ← 1, total ← 5
pass 1 of 214{15 if (keep(value5))16 {17 kept→ 1++;18 total→ 5 += value5;19 }kept ← 2, total ← 12
pass 2 of 214{15 if (keep(value7))16 {17 kept→ 2++;18 total→ 12 += value7;19 }Console.WriteLine($"minimum={minimum}");
22 Console.WriteLine($"minimum={minimum5}");23 Console.WriteLine($"kept={kept2}");24 Console.WriteLine($"total={total12}");25}outputminimum=5 kept=2 total=12