如何最有效地解析这个单行控制台输入

How to parse this single line Console input most efficiently

我正在尝试在带有 [ ,] 分隔符的单行中获取用户的输入。像这样:

[Q,W,1] [R,T,3] [Y,U,9]

然后我将在这样的函数中使用这些输入:

f.MyFunction('Q','W',1); // Third parameter will be taken as integer
f.MyFunction('R','T',3);
f.MyFunction('Y','U',9);

我以为我可以这样做:

    string input = Console.ReadLine();
    string input1 = input.Split(' ')[0];
    char   input2 = input.Trim(',') [0];

不过好像重复了很多。 最合乎逻辑的方法是什么?

好吧,您可以使用 LinQ to objects 函数并执行如下操作:

var inputs = input.Split(' ')
    .Select(x =>
        x.Replace("[", "")
         .Replace("]", ""))
    .Select(x => new UserInput(x))
    .ToList();

foreach(var userInput in inputs)
{
   f.MyFunction(userInput.A, userInput.B, userInput.Number);
} 

// 其他地方

public record UserInput
{
    public UserInput(string input)
    {
        //Do some kind of validation here and throw exception accordingly
        var parts = input.Split(',');

        A = parts[0][0];
        B = parts[1][0];
        Number = Convert.ToInt32(parts[2]);
    }

    public char A { get; init; }
    public char B { get; init; }
    public int Number { get; init; }
};

或者您可以更进一步,为 UserInput 记录实现“运算符重载”,并使从字符串隐式转换为 UserInput

成为可能

有时正则表达式确实是完成这项工作的最佳工具。使用与输入模式匹配的模式并使用 Regex.Matches 提取所有可能的输入:

var funcArgRE = new Regex(@"\[(.),(.),(\d+)\]", RegexOptions.Compiled);

foreach (Match match in funcArgRE.Matches(input)) {
    var g = match.Groups;
    f.MyFunction(g[1].Value[0], g[2].Value[0], Int32.Parse(g[3].Value));
}