C#, Delegates and LINQ

Posted by JustinGreenwood on Geeks with Blogs See other posts from Geeks with Blogs or by JustinGreenwood
Published on Wed, 21 Mar 2012 11:07:09 GMT Indexed on 2012/03/21 23:30 UTC
Read the original article Hit count: 281

Filed under:
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!

© Geeks with Blogs or respective owner