Добавление исключений в метод TitleCase C # - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть следующий код, который преобразует строку в TitleCase. Я хотел бы создать исключение для этого, чтобы, если введенная строка нашла точные символы в последовательности, она проигнорировала бы ее и продолжила преобразовывать остальную часть строки. например. если часть строки содержит: ABC Я хочу игнорировать это как правило и приступить к преобразованию остальной части строки в TitleCase:

public string ConvertToTitleCase(string input)
    {
        char[] chars = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input.ToLower()).ToCharArray();

        for (int i = 0; i + 1 < chars.Length; i++)
        {

            if ((chars[i].Equals('\'')) ||
                (chars[i].Equals('-')))
            {
                chars[i + 1] = Char.ToUpper(chars[i + 1]);
            }
        }
        return new string(chars);
    }

Есть идеи?

Ответы [ 3 ]

1 голос
/ 10 февраля 2012

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

Все исключения в этом сценарии - это только те «части», которых вы не касаетесь.

Итак, алгоритм:

  • Разбейте строку на токены
  • Перечислите токены и обработайте (или проигнорируйте, если это исключение)
  • Присоедините токены обратно к строке.

Удачи:)

0 голосов
/ 10 февраля 2012

Это все, что вам нужно

       private string ConvertToTitleCase(string input, string ignore) {
            var lcSB = new StringBuilder();
            var lcStart = 0;
            while (lcStart < input.Length) {
                var lcNext = input.IndexOf(ignore, lcStart);
                if (lcNext < 0)
                    lcNext = input.Length;
                lcSB.Append(input.Substring(lcStart, lcNext - lcStart).ToUpper());
                if (lcNext < input.Length)
                    lcSB.Append(ignore);
                lcStart = lcNext + ignore.Length;
            }
            return lcSB.ToString();
        }
0 голосов
/ 10 февраля 2012

Вы должны попробовать что-то вроде этого, используя MatchEvaluator

return Regex.Replace(input,
                     @"\S+",
                     (match) =>
                     {
                             var word = match.Value;

                             var formatException = yourListOfTitleCaseExceptions.FirstOrDefault(e => e.Trim().Equals(word, StringComparison.InvariantCultureIgnoreCase));

                                    if (formatException == null)
                                    {
                                        Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())
                                    }

                                    return formatException.Trim();

                                });

Это разделит слова на части, проверит список исключений, которые вы сделали, и проигнорирует их в названии. Если слово не найдено, оно получит заглавные буквы, как и ожидалось. Если исключение найдено, слово без изменений будет возвращено.

...