鉴于此示例代码段:
if(test == 5) {
var = 5;
var2 = 6;
}
else if(test == 6){
var = 30;
var2 = 25;
}
//...ect
如何将其清理成功能?我想过这样做:
void doStuff(int condition, int v1, int v2){
if(test == condition){
var = v1;
var2 = v2;
}
}
但是我必须像这样实现它:
doStuff(5,5,6);
doStuff(6,30,25);
//...ect
这将通过每个函数并检查每个if语句,即使第一个被评估为真。这不会有if,else if,else函数,除非我做了这样的事情:
//Assuming doStuff returns a bool
if(doStuff(5,5,6)
else if(doStuff(6,30,25))
//...ect
有没有更好的方法将函数放入条件if / else if语句中?
答案 0 :(得分:1)
switch
方法可能是最好的,但如果案例数量巨大,你可以考虑做一些有趣的事情......
private static readonly Dictionary<int, int[]> _dic = new...
private void Foo()
{
var test = ...
var vals = this._dic[test];
a = vals[0];
b = vals[1];
...
}
如果并非所有变量都属于int
类型,您可以使用Tuple
或您自己的结构来保存信息(+1表示命名值)
编辑:关于“有关在if-else中使用方法的更好方式”的更新问题:
doStuff(5,5,6) || doStuff(6,30,25) || ...
将从左到右评估doStuff
,直到返回true
。
答案 1 :(得分:0)
var conditionsMap = new Dictionary<int, Tuple<int, int>>();
conditionsMap.Add(5, new Tuple<int, int>(5, 6));
conditionsMap.Add(6, new Tuple<int, int>(30, 25));
foreach (var entry in conditionsMap)
{
var key = entry.Key;
var var1 = entry.Value.Item1;
var var2 = entry.Value.Item2;
Console.WriteLine("{0}\n{1}\n{3}", key, var1, var2);
}
答案 2 :(得分:0)
在这些情况下,我倾向于使用带有自定义属性的枚举来定义不同的条件。对我来说,这使它保持简洁,有助于维护,并有助于限制可能的输入到预定义的集合。
这是一个完整的代码示例(可以粘贴到LINQPad中进行测试):
public class ValuesAttribute : Attribute
{
public int V1 { get; private set; }
public int V2 { get; private set; }
public ValuesAttribute(int v1, int v2)
{
V1 = v1;
V2 = v2;
}
}
public enum ValuesCase
{
[Values(5, 6)]
Five,
[Values(30, 25)]
Six
}
public void DoStuff(ValuesCase valuesCase)
{
// There are several ways to get an attribute value of an enum, but I like this one
ValuesAttribute values = valuesCase
.GetType()
.GetTypeInfo()
.GetDeclaredField(valuesCase.ToString())
.GetCustomAttribute<ValuesAttribute>();
if(values != null)
{
// Assign your variables or do whatever else you want here
Console.WriteLine(string.Join(", ", valuesCase.ToString(), values.V1, values.V2));
}
}
void Main()
{
DoStuff(ValuesCase.Five);
DoStuff(ValuesCase.Six);
}