I do apologize in advance if my question looks really dumb, but for some reason I can't look through more graceful solution to the problem. So I have a method that utilizes switch - case blocks similar to the below chunk of code:
public enum Items
{
    item_1, item_2, item_3, .... item_N
};
private string String_1 {get; set;}
private string String_2 {get; set;}
private string String_3 {get; set;}
// ...
private string String_N {get; set;}
public void DoSomething(Items item){
    switch(item){
        case item_1:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_1);
            break;
        case item_2:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_2);
            break;
        case item_3:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_3);
            break;
        // ...
        case item_N:
            MethodNumberOne();
            MethodNumberTwo();
            MethodNumberThree();
            Console.WriteLine($"{0} is displayed on the page", String_N);
As it can be seen from the above example switch statement is calling the same methods, and the only difference is the last Console call.
My question: is there a more elegant way to handle this situation as I don't really like the duplication of the code. So far I tried to carry out Items enum to separate class and pass this as parameter, but this approach doesn't work as static class can't be passed as parameter in C#
public static class Items {
    public string String_1 {get; set;}
    public string String_2 {get; set;}
    public string String_3 {get; set;}
    // ...
    private string String_N {get; set;}
}
// ....
public void DoSomething(Items item)
Any suggestions are greatly appreciated..
You could store the enum Items to String_X mapping in a dictionary rather than relying on a switch.
private IDictionary<Items, string> _itemStringMap = new Dicitionary<Items, string>()
{
   { Items.item_1, String_1 },
   //Other items here
};
public void DoSomething(Items item)
{
  var s = _itemStringMap[item];
  MethodNumberOne();
  MethodNumberTwo();
  MethodNumberThree();
  Console.WriteLine($"{0} is displayed on the page", s);
}
You may want to check that the item argument has a valid mapping and if not use a default string.
The simplest way to clean this up is to introduce a variable.
public void DoSomething(Items item){
    string foo;
    switch(item){
        case item_1:
            foo = String_1;
            break;
        case item_2:
            foo = String_2;
            break;
        case item_3:
            foo = String_3;
            break;
        // ...
        case item_N:
            foo = String_N;
            break;
    }
    MethodNumberOne();
    MethodNumberTwo();
    MethodNumberThree();
    Console.WriteLine($"{0} is displayed on the page", foo);
}
This makes it clear that what we really have is a key/value pair though, so we can go farther and store the strings in a dictionary.
var dict = new Dictionary<Items,string>()
{
    { item_1, string_1 },
    { item_2, string_2 },
    //...
    { item_N, string_N }
}
MethodNumberOne();
MethodNumberTwo();
MethodNumberThree();
Console.WriteLine($"{0} is displayed on the page", dict[item]);
Of course, you'll want to make sure the key (item) is valid, error handling, and all that jazz.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With