有没有办法将 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
.
我正在制作一个简单的 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
.