Я пытаюсь решить простую проблему синтаксического анализа, и я решил использовать перечисления для кодирования списков вариантов выбора.
Входные данные представляют собой прямой текст ascii, разбитый на блоки с уникальным заголовком и неуникальными идентификаторами.где данные.Я могу написать довольно общие методы символизации, не предоставляя никакого контекста относительно значения данных, и иметь дело с ним, как только он будет возвращен.
Выполнение этого со строками не проблема.Я просто передаю список и мы уходим.
Я не могу понять синтаксис для обобщения перечисления, и я мог бы использовать некоторую помощь.Я также мог бы быть слишком привязан к императивному мышлению и упустить простой ответ на этот вопрос.
Вот код, с которым мне трудно работать
private void parseToEnums(Enum returnEnum, string searchBlock, string startIDText,
string endIDText, string startText, string endText)
{
string ourSearchBlock = searchBlock;
int endIDidx = ourSearchBlock.IndexOf(endIDText);
while (ourSearchBlock.IndexOf(startText) != -1)
{
if (ourSearchBlock.Length == searchBlock.Length)
{
// first pass, trim off the region where the start text isn't valid
ourSearchBlock = ourSearchBlock.Remove(endIDidx, ourSearchBlock.Length - endIDidx);
// first pass, use the startIDtext to create a valid search zone
// BROKEN CODE HERE
// Neither GetType() nor typeof seem to do the right thing
// I have tried several varieties and have tried casting the LHS in the
// same sort of way
// pluckText returns a string that is guaranteed to match an enum name
returnEnum = (returnEnum.GetType()) System.Enum.Parse(typeof(returnEnum), pluckText(ourSearchBlock, startIDText, startText, endText), false);
ourSearchBlock = ourSearchBlock.Remove(0, ourSearchBlock.IndexOf(startIDText) + startIDText.Length);
}
else
{
// this would be similar to the above after it's working
// and is for the case where the string has multiple matches
// within the enum, ie "red white"
//returnList.Add(pluckText(ourSearchBlock, "", startText, endText));
}
ourSearchBlock = ourSearchBlock.Remove(0, ourSearchBlock.IndexOf(startText) + startText.Length);
}
return;
}
Пример того, что яделать
private enum Colors { red, white, green };
private enum Suits { spades, clubs, hearts, diamonds };
// ... open files, read data, etc
// so I pass in the enum that I want my result in and some text identifiers
parseToEnum ( Colors, searchBlock, "startColorBlock", "endColorBlock", "id=" );
parseToEnum ( Suits, searchBlock, "startCardSuitsBlock", "endCardSuitsBlock", "<id=" );
// ...
Таким образом, идея состоит в том, чтобы использовать ту же структуру (так как входы одинаковы), но использовать разные перечисления для вывода.
Я знаю, что мне нужно добавить некоторыепопробуйте / перехватите обертки и общее обнаружение ошибок в этом коде, прежде чем слишком долго.