有没有办法将 returns 可空布尔值 this 的检查压缩为 1-2 行?

Is there a way to compress a check that returns a nullable boolean this into 1-2 lines?

我正在制作一个简单的 C# 控制台应用程序,用户必须在 select 他们的选项中输入 1 或 2,显然,由于用户可以输入任何内容,我需要制作一个检查 return 是他们的输入,如果它不是 1 或 2,它将 return 为空。

这是我做的

bool? getResponse = null;
if (read == "1")
{
    getResponse = true;
}
else if (read == "2")
{
    getResponse = false;
}
else
{
    getResponse = null;
}

了解C#,肯定有办法简化这个,但我似乎找不到上网的方法。有什么指点吗?

可能您正在寻找 conditional operator ?:

但这可能维护起来很复杂并且难以阅读如果逻辑变得复杂(为 read == "3" 等添加逻辑)。

getResponse = read == "1" 
    ? true 
    : read == "2" 
        ? false 
        : null;

您可以应用的另一种方法是 switch expression for C# 9

getResponse = read switch
{
    "1" => true,
    "2" => false,
    _ => null,
};

第三种方法是使用 Dictionary

using System.Collections.Generic;
using System.Linq;

Dictionary<string, bool> resultDict = new Dictionary<string, bool>
{
    { "1", true },
    { "2", false }
};
        
getResponse = resultDict.TryGetValue(read, out bool _result) 
    ? _result 
    : null;

你可以在这种情况下使用ternary operator

string read = Console.ReadLine();

bool? response = read == "1" ? true
: read == "2" ? false : null;

但最好只有两种可能的方法,因为你可以看到它很容易失控。在这种情况下,我上面的代码没问题,但如果你有 10 种可能性,也许这样的方法是个好方法

// lets say there is ways 
// 1 = true, 2 = false, 3 = null
// and any other input means exception

string read = Console.ReadLine()!;

Dictionary<string, bool?> keyValues = new();
keyValues.Add("1", true);
keyValues.Add("2", false);
keyValues.Add("3", null);

bool? response = keyValues.ContainsKey(read) ? keyValues[read] 
    : throw new Exception();

这里的例外只是举个例子, 我的观点是,当你有多种可能性时 用字典做这样的事情似乎比 if/else、switch/case 或多条件三元运算符

干净得多

我认为这很难读,但它避免了嵌套的三元。

getResponse = int.TryParse(read, out var i) && i > 0 && i < 3 ? (bool)(2-i) : null;

string 解析为 int,确保它是有效范围,然后进行一些计算,以便将其转换为 bool。将整数类型转换为 bool 时,0 表示 false,而 non-zero 表示 true.