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