如何最有效地解析这个单行控制台输入
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));
}
我正在尝试在带有 [ ,] 分隔符的单行中获取用户的输入。像这样:
[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));
}