简单的If和Else如果使用函数

时间:2014-11-11 17:49:13

标签: c# conditional-statements

鉴于此示例代码段:

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语句中?

3 个答案:

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