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#有一个简单的方法来替换多个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