首页 > 解决方案 > 存储和重用条件表达式

问题描述

我需要在代码中多次评估相同的条件表达式。在 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");
    }
}

标签: c#

解决方案


不确定这是否正是您要查找的内容,但是从用户那里获得强类型(以及其他有效)输入的一种方便方法是编写一个接受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();

推荐阅读