使用函数的Simple If和Else If

本文关键字:If Else Simple 函数 | 更新日期: 2023-09-27 18:30:10

给定以下示例片段:

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语句,即使第一个语句被评估为true。除非我做了这样的事情,否则这不会有if,else if,els函数:

//Assuming doStuff returns a bool
if(doStuff(5,5,6)
else if(doStuff(6,30,25))
//...ect

有没有更好的方法将函数放入条件if/else-if语句中?

使用函数的Simple If和Else If

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

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

在这些情况下,我倾向于使用带有自定义属性的枚举来定义不同的条件。对我来说,这使它保持简洁,有助于维护,也有助于将可能的输入限制在预定义的集合中。

下面是一个完整的代码示例(可以粘贴到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);
}