I hate switch statements. They just looks bad.
So take a look at a nice example I've read at Luca Bolognese's, for switching from a switch based code to a cleaner one.
The syntax in pre-c#3 would be less nice (delegate() instead of lambda, and parseFuncs.Add instead of the initializer) but it's doable.
Heck, it reminds me of some old university-level Ansi-C code I've once wrote for a matrix-calculator program:
typedef struct {
char * name;
char * (*func)(char *);
char * description;
} cmd_class;
// matrix functions.
// pre: parameter string. post: answer is printed or stored in matrix
char * read_mat(char * parm_string);
char * print_mat(char * parm_string);
char * add_mat(char * parm_string);
char * sub_mat(char * parm_string);
char * mul_mat(char * parm_string);
char * mul_scalar(char * parm_string);
char * trans_mat(char * parm_string);
cmd_class cmd[] = {
{"read_mat", read_mat, "parameters: matrix,val1[,val2,...,val16]"},
{"print_mat", print_mat, "parameters: matrix"},
{"add_mat", add_mat, "parameters: matrix_A,matrix_B[,target_matrix]"},
{"sub_mat", sub_mat, "parameters: matrix_A,matrix_B[,target_matrix]"},
{"mul_mat", mul_mat, "parameters: matrix_A,matrix_B[,target_matrix]"},
{"mul_scalar", mul_scalar, "parameters: matrix,scalar[,target_matrix]"},
{"trans_mat", trans_mat, "parameters: matrix[,target_matrix]"},
{"stop", stop, "exit program"},
{"menu", print_menu, "print this menu"},
{"not_valid", NULL, "NULL"}
};
It allowed me to avoid switch by looping over the cmd[] array in a helper method, thus able to do
command(commandName).func(params);
Not exactly a typical jet-fighter-realtime-c-code, but it gave me a better looking code, and a 100/100 grade.