C#, Delegates and LINQ
- by JustinGreenwood
One of the topics many junior programmers struggle with is delegates. And today, anonymous delegates and lambda expressions are profuse in .net APIs. To help some VB programmers adapt to C# and the many equivalent flavors of delegates, I walked through some simple samples to show them the different flavors of delegates.
using System;
using System.Collections.Generic;
using System.Linq;
namespace DelegateExample
{
class Program
{
public delegate string ProcessStringDelegate(string data);
public static string ReverseStringStaticMethod(string data)
{
return new String(data.Reverse().ToArray());
}
static void Main(string[] args)
{
var stringDelegates = new List<ProcessStringDelegate>
{
//==========================================================
// Declare a new delegate instance and pass the name of the method in
new ProcessStringDelegate(ReverseStringStaticMethod),
//==========================================================
// A shortcut is to just and pass the name of the method in
ReverseStringStaticMethod,
//==========================================================
// You can create an anonymous delegate also
delegate (string inputString) //Scramble
{
var outString = inputString;
if (!string.IsNullOrWhiteSpace(inputString))
{
var rand = new Random();
var chs = inputString.ToCharArray();
for (int i = 0; i < inputString.Length * 3; i++)
{
int x = rand.Next(chs.Length), y = rand.Next(chs.Length);
char c = chs[x];
chs[x] = chs[y];
chs[y] = c;
}
outString = new string(chs);
}
return outString;
},
//==========================================================
// yet another syntax would be the lambda expression syntax
inputString => { // ROT13
var array = inputString.ToCharArray();
for (int i = 0; i < array.Length; i++)
{
int n = (int)array[i];
n += (n >= 'a' && n <= 'z') ?
((n > 'm') ? 13 : -13) :
((n >= 'A' && n <= 'Z') ?
((n > 'M') ? 13 : -13) : 0);
array[i] = (char)n;
}
return new string(array);
}
//==========================================================
};
// Display the results of the delegate calls
var stringToTransform = "Welcome to the jungle!";
System.Console.ForegroundColor = ConsoleColor.Cyan;
System.Console.Write("String to Process: ");
System.Console.ForegroundColor = ConsoleColor.Yellow;
System.Console.WriteLine(stringToTransform);
stringDelegates.ForEach(delegatePointer =>
{
System.Console.WriteLine();
System.Console.ForegroundColor = ConsoleColor.Cyan;
System.Console.Write("Delegate Method Name: ");
System.Console.ForegroundColor = ConsoleColor.Magenta;
System.Console.WriteLine(delegatePointer.Method.Name);
System.Console.ForegroundColor = ConsoleColor.Cyan;
System.Console.Write("Delegate Result: ");
System.Console.ForegroundColor = ConsoleColor.White;
System.Console.WriteLine(delegatePointer(stringToTransform));
});
System.Console.ReadKey();
}
}
}
The output of the program is below:
String to Process: Welcome to the jungle!
Delegate Method Name: ReverseStringStaticMethod
Delegate Result: !elgnuj eht ot emocleW
Delegate Method Name: ReverseStringStaticMethod
Delegate Result: !elgnuj eht ot emocleW
Delegate Method Name: b__1
Delegate Result: cg ljotWotem!le une eh
Delegate Method Name: b__2
Delegate Result: dX_V|`X ?| ?[X ]?{Z_X!