一种压缩多个阅读线的方法?

A way to condense multiple readlines?

我是编程新手,所以除了我们在 c# class 中所做的工作外,我自己不太了解,但我几乎到处都在寻找一种压缩 readlines 的方法,以便该程序将连续读取许多输入,而无需为用户输入的每个变量编写一个读取行。

        Console.WriteLine("Enter ID for Jane Doe: ");
        c.ID = Console.ReadLine();

        Console.WriteLine("Enter Insurance Name for Jane Doe: ");
        c.Insurance = Console.ReadLine();

        Console.WriteLine("Enter Height(In.) for Jane Doe: ");
        c.Height = Convert.ToInt32(Console.ReadLine());

        Console.WriteLine("Enter Weight(lbs.) for Jane Doe: ");
        c.Weight = Convert.ToSingle(Console.ReadLine());

        Console.WriteLine("Enter Health Status for Jane Doe: ");
        c.HealthStatus = Console.ReadLine();

这个例子来自不久前的一些作业,但令我苦恼的是我找不到压缩代码的方法。 基本上我希望能够在一个 writeline 中请求所有信息,然后只使用一个 readline/other 方法输入每个变量,用户在其中输入一个变量的信息,点击回车,然后重复,但经常是这样需要。有什么办法可以做到这一点,还是我只需要处理重复问题?

一般情况下,您只需要处理重复即可。它清晰、易于调试,而且确实还不错

现在,您可以这样做:

public class InputRequest
{
     public String Request {get; set;}
     public Action InputMethod {get; set;}
}

然后你会像这样创建:

List<InputRequest> allInputs = new List<InputRequest>();
allInputs.Add(new InputRequest() { Request = "Enter your height", 
    InputMethod = new Action(() => currentPerson.Height = Convert.ToInt32(Console.ReadLine())));

然后你可以遍历它们:

foreach (InputRequest req in allInputs)
{
    Console.WriteLine(req.Request);
    req.InputMethod();
}

但实际上,为了代码更小,这会降低很多可读性。我可能会在 不同的 上下文中使用这样的模式,但在这里,您的代码没问题。

恐怕就是这样!无论如何,最好的方法是,您总是可以读取一个字符串然后将其拆分,但这将涉及额外的处理和更多的时间消耗..这种方式将是

Console.WriteLine("Please enter info in the following format");
Console.WriteLine("ID Name Height Weight Status");

data = Console.ReadLine();
var info = data.Split(" ");
c.Id = info[0];
c.Insurance = info[1];
c.Height = int.Parse(info[2]);

etc...

你拥有它的方式你可以做额外的处理,比如

int value;
do
{
    Console.WriteLine("Enter Height");
}
while(int.TryParse(Console.ReadLine(), out value))

这会让您的用户一直循环,直到他们输入有效的身高

老实说,据我所知,没有比这更好的了。你可以试试 readability/reusability

public String promtUser(String prompt)
{
    Console.WriteLine(prompt + ": ");
    return Console.ReadLine()
}

简单且可重复使用。虽然不完美。

如果我问了很多问题,而且它们是针对少数数据类型的回答,我可能会选择以下内容:

    var answer1 = AskString("Give me a string:");
    var answer2 = AskInt   ("Give me an int:");
    var answer3 = AskSingle("Give me a single:");

有如下配套方法

    Single AskSingle(string text)
    {
        Console.WriteLine(text);
        return Convert.ToSingle(Console.ReadLine());
    }

简单易读。除非有几个问题被问到,否则我不会打扰。也可以在 "Ask" 方法中包含您期望的数据类型的验证代码。例如,如果您期望一个 int 并得到一个字符串,您可以让用户有机会重新输入它,或者向他们返回一个错误。

对于可读性优先于紧凑性的偶尔使用,您可以尝试类似这样的方法对单行输入进行简单的多字段解析。

Console.Write("Enter the following info for Jane Doe, separated by commas:\n" +
              "    ID, Insurance Name, Height(in.), Weight(lbs.), Health Status.\n" +
              "==> ");
string input = Console.ReadLine();

char[] separators = {','};
string[] values = input.Split(separators);
c.ID           = (values.Count() >= 1) ? values[0].Trim() : null;
c.Insurance    = (values.Count() >= 2) ? values[1].Trim() : null;
c.Height       = (values.Count() >= 3) ? values[2].Trim() : null;
c.Weight       = (values.Count() >= 4) ? values[3].Trim() : null;
c.HealthStatus = (values.Count() >= 5) ? values[4].Trim() : null;