c# - 存储和重用条件表达式
问题描述
我需要在代码中多次评估相同的条件表达式。在 C# 中存储和重新评估条件表达式的最佳方法是什么
例如。我想删除 while 和 if 中给出的条件表达式的重复,而不使用额外的函数调用
while(!int.tryparse(num) || num <= 0 || num > 2000)
{
num = console.ReadLine();
if(!int.tryparse(num) || num <= 0 || num > 2000)
{
console.write("There is an error in the input value");
}
}
解决方案
不确定这是否正是您要查找的内容,但是从用户那里获得强类型(以及其他有效)输入的一种方便方法是编写一个接受string
提示的方法(要求用户输入一些输入)和一个可选Func<int, bool>
参数,true
如果int
满足某些条件则返回。如果输入不正确,我们还可以显示可选的错误消息。
这是我过去使用的一种方法:
public static int GetIntFromUser(string prompt, Func<int, bool> validator = null,
string error = null)
{
int result;
bool invalidInput = false;
do
{
if (invalidInput && !string.IsNullOrEmpty(error))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(error);
Console.ResetColor();
}
Console.Write(prompt);
invalidInput = true;
} while (!int.TryParse(Console.ReadLine(), out result) ||
(validator != null && !validator.Invoke(result)));
return result;
}
在使用中,它让生活变得非常简单,因为您无需再次编写验证代码。请注意,我们可以为验证器参数编写一个内联 lambda 表达式:
int input = GetIntFromUser("Enter a number from 0 to 2000: ",
x => x >= 0 && x < 2000, "Invalid number, try again.");
输出
现在,如果我们想一遍又一遍地使用完全相同的Func<int>
验证(在不同的代码区域,在循环之外),我们可以将上述方法调用提取到 a并在需要时调用它:
Func<int> ZeroTo2000 = () => Temp.GetIntFromUser("Enter a number from 0 to 2000: ",
x => x >= 0 && x < 2000, "Invalid number, try again.");
int input1 = ZeroTo2000();
int input2 = ZeroTo2000();
推荐阅读
- batch-file - 批处理文件需要每分钟从另一个主批处理文件执行
- angular - Angular 7:当模型的属性发生变化时如何重新验证控制
- angular - Angular 6 如何实现 canActivateChild
- c++ - 用大小初始化类成员向量失败
- sql - 使用更新隐式连接?
- sapui5 - 部署到 sapui5 abap 存储库后不再显示扩展点
- r - Prcomp:有关比例参数的信息
- ios - iOS:来自 URLSession.shared.dataTask 的数据(其中:url 始终为零(在 xcode 调试器中显示 0 字节错误?)
- jboss - Wildfly 13.x 上的战争部署问题。为什么?
- java - Java广播消息到arraylist