C# 用C语言处理开关箱的更好方法#

C# 用C语言处理开关箱的更好方法#,c#,coding-style,enums,C#,Coding Style,Enums,如果我的问题看起来真的很愚蠢,我会提前道歉,但出于某种原因,我无法找到更优雅的解决方案。因此,我有一种方法,它利用了类似于下面代码块的switch-case块: 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

如果我的问题看起来真的很愚蠢,我会提前道歉,但出于某种原因,我无法找到更优雅的解决方案。因此,我有一种方法,它利用了类似于下面代码块的switch-case块:

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);
从上面的示例可以看出,switch语句调用相同的方法,唯一的区别是最后一次控制台调用

我的问题是:有没有更优雅的方法来处理这种情况,因为我真的不喜欢代码的重复。到目前为止,我尝试执行Items enum来分离类并将其作为参数传递,但这种方法不起作用,因为在C中静态类不能作为参数传递#

  • 不允许声明此方法

如有任何建议,我们将不胜感激

您可以将
enum Items
String\u X
映射存储在字典中,而不依赖于开关

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);
}
private IDictionary\u itemStringMap=new dictionary()
{
{Items.item_1,String_1},
//这里还有其他项目吗
};
公共无效剂量测定(项目)
{
var s=_itemStringMap[item];
MethodNumberOne();
方法编号wo();
方法数树();
Console.WriteLine($“{0}显示在页面上”,s);
}

您可能需要检查
参数是否具有有效的映射,如果没有,则使用默认字符串。

清除此问题的最简单方法是引入变量

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);
}

这清楚地表明,我们真正拥有的是一个键/值对,因此我们可以进一步将字符串存储在字典中

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]);
var dict=newdictionary()
{
{item_1,string_1},
{item_2,string_2},
//...
{item\u N,string\u N}
}
MethodNumberOne();
方法编号wo();
方法数树();
WriteLine($“{0}显示在页面上”,dict[item]);

当然,您需要确保键(项)有效、错误处理等

您是否可以使用数组来保存字符串_1、字符串_2等项(例如,称为stringsArray[]),然后您可以像这样访问stringsArray[item_1]而不是控制台;您将拥有Console.WriteLine($“{0}显示在页面上”,stringsArray[item_2]);或者,在进入交换块之前,考虑<代码>字典<代码>,调用这三种方法。在开关块中,按现在的方式调用控制台。那很简单。可能是复制品。我一定会试试的。哦。如果你用这本词典,一定要先通读一遍。我在回答中展示了一个使用索引器的示例,但是使用索引器有一些微妙之处。在实际代码中,您更可能使用
TryGetValue(item,out foo)
我不理解下面的投票。在发布之前,我至少提供了一个和公认答案一样好的答案。这个网站有时。。。
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]);