使用函数的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语句中?
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);
}