Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

C#: Using a dictionary instead of if statements

DZone's Guide to

C#: Using a dictionary instead of if statements

·
Free Resource

A problem we had to solve on my current project is how to handle form submission where the user can click on a different button depending whether they want to go to the previous page, save the form or go to the next page.

An imperative approach to this problem might yield code similar to the following:

public class SomeController
{
public ActionResult TheAction(string whichButton, UserData userData)
{
if(whichButton == "Back")
{
// do the back action
}
else if(whichButton == "Next")
{
// do the next action
}
else if(whichButton == "Save")
{
// do the save action
}

throw Exception("");
}
}

A neat design idea which my colleague Dermot Kilroy introduced on our project is the idea of using a dictionary to map to the different actions instead of using if statements.

public class SomeController
{
private Dictionary<string, Func<UserData,ActionResult>> handleAction =
new Dictionary<string, Func<UserData,ActionResult>>
{ { "Back", SaveAction },
{ "Next", NextAction },
{ "Save", SaveAction } };

public ActionResult TheAction(string whichButton, UserData userData)
{
if(handleAction.ContainsKey(whichButton))
{
return handleAction[whichButton](userData);
}

throw Exception("");
}

private ActionResult NextAction(UserData userData)
{
// do cool stuff
}
}

It's quite similar in a way to a problem we had on another project where we needed to deal with user inputs and then create an object appropriately.

The way we have to read the code is a bit more indirect than with the original approach since you now need to click through to the individual methods for each action.

On the other hand I like the fact that we don't have if statements all over the place anymore.



Topics:

Published at DZone with permission of Mark Needham, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}