【发布时间】:2010-07-21 20:16:09
【问题描述】:
我正在尝试编写一种动态排序的命令行处理器,其中我有一个字典,其中键是可能的参数,成员是一个 Action,其中字符串是命令行上传递的参数之间的文本。希望能够通过添加 params 数组并在字典中写入动作来添加参数。
是的,我意识到这是为了简化维护而使实现过于复杂的毫无意义的练习。主要是想强调自己学习更多 linq。
这是我的字典:
private static Dictionary<string[], Action<string>> _commandLineParametersProcessor = new Dictionary<string[], Action<string>>()
{
{
new string[] {"-l", "--l", "-log", "--log"},
(logFile) =>
{
_blaBla.LogFilePath = logFile;
}
},
{
new string[] { "-s", "--s", "-server", "--server" },
(server) =>
{
ExecuteSomething(server);
_blaBla.Server = server;
}
}
};
采用 string[] 参数的最优雅的机制是什么,而不仅仅是关联任何字典键数组中的成员,而是 Aggregate((x,y) => string.Format("{0} {1 }", x, y)) args[] 成员之间的元素序列(认为 TakeWhile() 以某种方式适合这里)将包含在任何键数组中,并将它们交给相应键的值成员。
我们都无数次地编写过这些小命令行处理器,虽然显然一个简单的循环和切换总是绰绰有余,但正如我所说的那样,这又是一个试图强调我的 linq 技能的练习。所以请不要抱怨我过度设计,这部分是显而易见的。
更新: 为了让这可能更容易一点,这里有一种非 linq 的方式来做我正在寻找的事情(可能不完美,这只是暂时的):
Action<string> currentAction;
string currentActionParameter;
for(int i = 0; i < e.Args.Length; i++)
{
bool isParameterSwitch = _commandLineParametersProcessor.Keys.Any((parameterChoices) => parameterChoices.Contains(e.Args[i]));
if (isParameterSwitch)
{
if (!string.IsNullOrEmpty(currentActionParameter) && currentAction != null)
{
currentAction(currentActionParameter);
currentAction = null;
currentActionParameter = "";
}
currentAction = _commandLineParametersProcessor[_commandLineParametersProcessor.Keys.Single((parameterChoices) => parameterChoices.Contains(e.Args[i]))];
}
else
{
currentActionParameter = string.Format("{0} {1}", currentActionParameter, e.Args[i]);
}
}
这不是一个完全糟糕的方法,我只是想知道是否有人可以使用 linq 或其他方式简化它,尽管这可能是我猜的最简单的形式..
【问题讨论】:
-
LINQ 可能不是这类问题的正确答案...
-
我不清楚您要做什么。您能否举一个具体的例子来说明“聚合 args[] 成员之间的元素序列,这些元素将包含在任何键数组中”位是什么意思?
-
有时使用锤子是因为您想了解更多关于锤子的知识,但这并不意味着螺丝刀真的是更好的工具。我不确定 LINQ 会在这里做什么。您有一组由字符串数组键入的操作,并且您想要...什么?使用用户输入的可能匹配键数组中任何字符串的字符串从字典中选择并执行操作?嗯,实际上,这确实有道理。好吧,也许这里可以使用 LINQ ,但我对 LINQ 的了解不够,无法向您展示如何...
-
作为参数开关的 args 之间的聚合指的是命令行类似于: bla.exe --log some log file.log --s myserver.com args 数组将有 3 个成员需要连接才能传递到 --log 的操作中,并且只有一个用于 --s 操作
标签: c# linq dictionary lambda