Я пытаюсь написать динамический вид процессора командной строки, где у меня есть словарь с ключами, являющимися возможными параметрами, и членом, являющимся действием, где строка является текстом между параметрами, передаваемыми в командной строке.Хотите иметь возможность добавлять параметры, просто добавляя массив 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;
}
}
};
Какой самый элегантный механизм для получения строковых [] аргументов, а не только для корреляции членов, которые попадают влюбой из ключевых массивов словаря, но Aggregate ((x, y) => string.Format ("{0} {1}", x, y)) последовательность элементов (считая, что TakeWhile () как-то здесь подходит)между членами args [], которые будут содержать Contain () ed в любом из массивов ключей, и передать их в действие соответствующего значения элемента ключа.
Мы все написали эти маленькие процессоры командной строки бесчисленное количество рази, хотя очевидно, что простой цикл и переключение всегда более чем адекватны, это снова, как я сказал, упражнение, пытающееся подчеркнуть мои навыки 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 или иным способом, хотя, возможно, это самая простая форма..