Lambada in C#

time to read 9 min | 1626 words

Sriram Krishnan attempts to create lambada in C#, and James Robertson sneers at the attempt.
Peronally, I don't understand why she took the string approach even if she wanted to remain general. Delegates are perfectly possible to move a delegate around in a type-safe manner.

Here is a possible solution1, it works for both static and instance methods.

     1: using System;
     2: using System.Collections;
     3:  
     4: namespace Lambada
     5: {
     6:     class Mai2n
     7:     {
     8:         private static string[] words = {"dog","cat","mink"};
     9:         delegate void StringDelegate(string args);
    10:         delegate string RetStringDelegate(string args);
    11:         delegate void IntegerDelegate(int i);
    12:  
    13:         private static void PrintInt(int i)
    14:         {
    15:             Console.WriteLine("Integer: " +i);
    16:         }
    17:  
    18:         private static void PrintStr(string str)
    19:         {
    20:             Console.WriteLine(str);
    21:         }
    22:  
    23:         private static string Capitalize(string str)
    24:         {
    25:             if(!Char.IsUpper(str,0))
    26:                 str = Char.ToUpper(str[0])+str.Substring(1);
    27:             return str;
    28:         }
    29:  
    30:         private int multiplyBy;
    31:         public void Multiply(int i)
    32:         {
    33:             Console.WriteLine("Multiply by "
+ multiplyBy +": " + i*multiplyBy);
    34:         }
    35:  
    36:         public static void Main(string[] args)
    37:         {
    38:             Mai2n m = new Mai2n();
    39:             m.multiplyBy = 2;
    40:             Map(new StringDelegate(PrintStr),words);
    41:             Map(new IntegerDelegate(PrintInt),new int[]
{1,3,5,7,11,13});
    42:             Map(new StringDelegate(PrintStr),
    43:                 ReturningMap(new RetStringDelegate(Capitalize)
                         ,words));
    44:             Map(new IntegerDelegate(m.Multiply),new int[]
                             {2,4,6,8,10});
    45:         }
    46:  
    47:         public static void Map(Delegate d, IList list)
    48:         {
    49:             foreach (object o in list)
    50:             {
    51:                 d.DynamicInvoke(new object[]{o});
    52:             }
    53:         }
    54:  
    55:         public static IList ReturningMap(Delegate d, IList list)
    56:         {
    57:             ArrayList al = new ArrayList(list.Count);
    58:             object ret;
    59:             foreach(object o in list)
    60:             {
    61:                 ret = d.DynamicInvoke(new object[]{o});
    62:                 if(ret!=null)
    63:                     al.Add(ret);
    64:             }
    65:             return al;
    66:         }
    67:     }
    68: }

Here is the output of the above program:

dog
cat
mink
Integer: 1
Integer: 3
Integer: 5
Integer: 7
Integer: 11
Integer: 13
Dog
Cat
Mink
Multiply by 2: 4
Multiply by 2: 8
Multiply by 2: 12
Multiply by 2: 16
Multiply by 2: 20

 

1 Possible restrictions about no error checking, validation etc apply :-)

 

"A coat hanger is 44 inches long when straightened." -- Fact of lifes

"Quality assurance: A way to ensure you never deliver shoddy goods accidentally." -- Tech Support Slogan

"If you yelled for 8 years, 7 months and 6 days, you would have produced enough sound energy to heat one cup of coffee." -- Fact of lifes

[Listening to: Better Than Ezra - One More Murder - - (04:39)]