c#有一个简单的方法来替换多个if语句吗?
本文关键字:if 语句 替换 简单 有一个 方法 | 更新日期: 2023-09-27 17:50:25
我有以下代码:
if (testQuestion.Result == "t") { testQuestion.CorrectCount++; }
if (testQuestion.Result == "f") { testQuestion.IncorrectCount--; }
if (testQuestion.Result == "s") { testQuestion.ShownCount++; }
有没有办法可以不需要三个if语句?
由于c#允许切换字符串,您可以使用下面的switch语句:
switch (testQuestion.Result) {
case "t": testQuestion.CorrectCount++; break;
case "f": testQuestion.IncorrectCount--; break;
case "s": testQuestion.ShownCount++; break;
}
你可以在这里找到更多关于c#中switch语句的细节
可以使用switch语句:
switch (testQuestion.Result)
{
case "t":
testQuestion.CorrectCount++;
break;
case "f":
testQuestion. IncorrectCount--;
break;
case "s":
testQuestion.ShowCount++;
break;
default:
// Result is a different value from what's expected
}
或者,如果你喜欢更简洁的公式:
var q = testQuestion;
switch (q.Result)
{
case "t": q.CorrectCount++; break;
case "f": q. IncorrectCount--; break;
case "s": q.ShowCount++; break;
}
我应该提到,如果你的Result
属性是Char
类型,那么你应该在你的值周围使用撇号而不是引号。
EDIT:您可能还需要default
语句来处理意外情况。我只是将它添加到上面的第一个代码块中。
另一种选择是使用三元操作符:
testQuestion.CorrectCount += (testQuestion.Result == "t"? 1 : 0);
testQuestion.IncorrectCount += (testQuestion.Result == "f"? -1 : 0);
testQuestion.ShownCount += (testQuestion.Result == "s"? 1 : 0);
选项2
您可以将逻辑包装在属性中,如下面的代码所示。在我看来,这样更容易读懂。
public class TestQuestion
{
private string _result;
public string Result
{
get
{
return _result;
}
set
{
_result = value;
this.CorrectCount += (this._result == Meta.correctResult ? Meta.incrementCount: 0);
this.IncorrectCount += (this._result == Meta.incorrectResult ? Meta.decrementCount : 0);
this.ShownCount += (this._result == Meta.shownResult ? Meta.incrementCount : 0);
}
}
public int CorrectCount;
public int IncorrectCount;
public int ShownCount;
}
这里是Meta的代码,这使得在一个地方配置和控制变得容易。
public class Meta
{
public static string correctResult = "t";
public static string incorrectResult = "f";
public static string shownResult = "s";
public static int incrementCount = 1;
public static int decrementCount = -1;
}
这是我在LinqPad
中的使用方法void Main()
{
TestQuestion testQuestion = new TestQuestion();
testQuestion.Result = "t";
testQuestion.Result = "f";
testQuestion.Result = "s";
testQuestion.Dump();
}
不是更容易读吗?
虽然来晚了,但我还差几分钱。通过字典Dictionary<string,Action>
创建查找,将字符串值作为键,并在操作委托中执行各种操作。然后初始化构造函数中的查找。下面是示例代码:
public class Example
{
private static Dictionary<string,Action> _lookup=new();
private static void Init(TestQuestion testQuestion)
{
_lookup.Add("t",()=> testQuestion.CorrectCount++);
_lookup.Add("f",()=> testQuestion.InCorrectCount--);
_lookup.Add("s",()=> testQuestion.ShownCount++);
}
public void ExampleMethod(TestQuestion testQuestion)
{
Init(testQuestion);
_lookup[testQuestion.Result](); // this pull the matching action and execute with `()` added
}
}
这是一个示例,实际上这个查找应该移动到单独的类中。上面的代码去掉了multiple if-else