Лучший способ сравнения строковых массивов (пользовательские команды командной строки) - PullRequest
4 голосов
/ 01 января 2012

В моем приложении я делаю пользовательскую командную строку.Я ищу лучший способ проверить введенные пользователем команды и аргументы против аргументов, которые я определил.Возьмите следующий пример команды (которая работает, если пользователь вводит ее правильно и по порядку)

do>Drawer /X:Time /Y:Current /N:Window NAme /D:Description

Теперь я хочу иметь метод для проверки для меня:

private string CheckDrawerArgs(string[] args)
{
    var mustExist = new string[4]{"X:", "Y:", "N:", "D:"};

    if(args.Length != mustExist.Length)
    {
        return "Arguments are not completly defined. use 'Drawer /?' for help.";
    }

    var argsAreRight = false;

    var flat = from s1 in args
               from s2 in mustExist
               where s1.StartsWith(s2) 

        //how to check if all elements provided 
        // in args does look 
        // like (Starts with) elements in mustExist

        ;
    if(argsAreRight == false)
    {
        return "Bad arguments";
    }

    //Proceed with rest...
}

Итакто, что я ищу, это проверить, есть ли требуемые аргументы, предоставленные пользователем, в args, и они не дублируются, в то время как их порядок не повлияет на проверку ...

Заглядывая впередза советы!

Ответы [ 3 ]

3 голосов
/ 01 января 2012

Я бы порекомендовал написать его более многократно.Тот факт, что все параметры должны быть заданы, не должен быть жестко закодирован в логике анализатора параметров.Вы должны просто проверить это в конце, прямо перед тем, как «продолжить отдых».

В таких случаях я обычно делаю следующее:

Прежде всего, для каждого извозможные аргументы У меня есть некоторые переменные, которые содержат разумные значения по умолчанию (так что аргумент может быть опущен), тривиальным примером которого будет bool argument_x_given = false;

Итак, я перебираю заданные аргументы и внутри цикла Iпроверьте текущий аргумент против каждого из возможных аргументов, чтобы найти, какой это аргумент.Если не найден, у нас есть ошибка.Если найден соответствующий аргумент, я анализирую остальную часть аргумента (материал после ':') и устанавливаю переменные, связанные с аргументом.При этом я проверяю, чтобы аргумент не был дубликатом.В приведенном здесь тривиальном примере это будет if( argument_x_given ) { --error-- } else { argument_x_given = true; ... }.

Наконец, когда цикл завершен, я проверяю, что все необходимые аргументы были заданы.

Итак, что я пытаюсьСказать, что вы ничего не получите, сравнивая строковые массивы, потому что вам все равно придется разбираться во всех ваших аргументах, а также сравнивать строковые массивы - все равно, что пытаться воспользоваться ситуацией.которая очень специфична для рассматриваемой проблемы и не используется повторно.

1 голос
/ 01 января 2012

Ни один из предоставленных примеров не учитывает символы косой черты, с которых начинается каждый аргумент командной строки.Возможно, вам потребуется изменить mustExist, включив в него прямые косые черты:

var mustExist = new string[4]{"/X:", "/Y:", "/N:", "/R:"};

Другой вариант - убрать их из аргументов перед сравнением.

1 голос
/ 01 января 2012

В дополнение к ответу Хенка проверено и работает следующее

 var allpresent = args.Length == mustExist.Length && args.All(c =>
                                                     mustExist.Any(e =>
                                                     c.ToString().StartsWith(e)));
...