Как получить подстроку из предложения в C# - PullRequest
0 голосов
/ 12 марта 2020

Я хочу получить указанную c подстроку в указанном c условии.

  1. , если строка "Update xxx.csv / addroles", то ProcessCommandAsync(input.Substring(0, split), input.Substring(startIndex, endIndex - startIndex), input.Substring(indexOfChar + 1)) должна содержать первый параметр Update, второй параметр xxx.csv и третий должны быть addroles.

  2. , если строка "Update xxx.csv", то она должна вернуть первый параметр update и второй xxx.csv.

Существует проблема, если я предоставлю только 2 параметра. Он жалуется на

System.ArgumentOutOfRangeException: «Длина не может быть меньше нуля. Имя параметра: длина '

public async Task WaitForInputAsync()
        {
            while(true)
            {
                Console.Write("Enter Command: ");
                Console.ForegroundColor = ConsoleColor.White;
                var input = Console.ReadLine();
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                var split = input.IndexOf(" ");              
                var indexOfChar = input.IndexOf('/');          

                int startIndex = input.IndexOf(input.Substring(split + 1));
                int endIndex = input.IndexOf("/") + (("/").Length)-1;
                if (split >= 0)
                {             
                    await ProcessCommandAsync(input.Substring(0, split), input.Substring(startIndex, endIndex - startIndex), input.Substring(indexOfChar + 1));
                }
                else
                {
                    await ProcessCommandAsync(input);
                }
            }
        }

Ответы [ 4 ]

3 голосов
/ 12 марта 2020

Вы можете использовать метод Enumerable.ElementAtOrDefault

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

var s = input.Split(' ')
             .Select(x => x.TrimStart('/'))
             .ToArray();

ProcessCommand(s.ElementAtOrDefault(0), s.ElementAtOrDefault(1), s.ElementAtOrDefault(2));
1 голос
/ 12 марта 2020

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

Иногда в небольших хобби-проектах я использовал это: https://github.com/commandlineparser/commandline

Это не единственный вариант, есть много разных проектов, которые сосредоточены на этом.

Редактировать: Если вы хотите узнать больше о топи c Вы можете прочитать эту статью в codeproject, но не единственном: https://www.codeproject.com/Articles/1236763/Flexible-Csharp-Command-Line-Parsing-via-Attribute

Кроме того, я должен сказать, что "attribute-way" не единственный способ сделать достичь этого.

0 голосов
/ 12 марта 2020

Не удается проверить, является ли индекс действительным.

int endIndex = input.IndexOf("/") + (("/").Length)-1;

endIndex равно -1, если '/' не существует.

// endIndex - startIndex is less than 0;
input.Substring(startIndex, endIndex - startIndex), 

Я копирую ваш код ниже и оставляйте комментарии о позиции.

public async Task WaitForInputAsync()
    {
        while(true)
        {
            Console.Write("Enter Command: ");
            Console.ForegroundColor = ConsoleColor.White;

            var input = Console.ReadLine();
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            var split = input.IndexOf(" ");

            // This could be -1 if '/' is not found        
            var indexOfChar = input.IndexOf('/');          

            int startIndex = input.IndexOf(input.Substring(split + 1));
            int endIndex = input.IndexOf("/") + (("/").Length)-1;
            if (split >= 0)
            {             
                await ProcessCommandAsync(input.Substring(0, split), 

            // endIndex - startIndex is less than 0;
             input.Substring(startIndex, endIndex - startIndex), 

             input.Substring(indexOfChar + 1));
            }
            else
            {
                await ProcessCommandAsync(input);
            }
        }
    }

Однако я предлагаю взглянуть на ответ @DrkDeveloper, команда разбора - боль в шее ..

0 голосов
/ 12 марта 2020

Используя приведенный выше пример «Обновление xxx.csv / addroles», я разделил бы входную строку пробелом и затем использовал switch для выполнения метода в зависимости от того, сколько у вас подстрок .. .

string input = "Update xxx.csv /addroles";
string[] strings = input.Split(' '); //split string at space char
int stringCnt = strings.Length; //get string count

switch(stringCnt) {
    case 0:
        //do something?
        break;
    case 1:
        await ProcessCommandAsync(strings[0]);
        break;
    case 2:
        await ProcessCommandAsync(strings[0], strings[1]);
        break;
    case 3:
        await ProcessCommandAsync(strings[0], strings[1], strings[2].TrimStart('/'));   
        break;
    default:
        //do something?
        break;
}//switch
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...