Подтвердить что ты не робот

Обнаружение, если строка - это все CAPS

В С# есть ли способ определить, есть ли строка в шапке?

Большинство строк будут короткими (т.е. менее 100 символов)

4b9b3361

Ответ 1

Не нужно создавать новую строку:

bool IsAllUpper(string input)
{
    for (int i = 0; i < input.Length; i++)
    {
        if (!Char.IsUpper(input[i]))
             return false;
    }

    return true;
}

Изменить: Если вы хотите пропустить неалфавитные символы (оригинальная реализация OP не имеет значения, но его комментарии указывают, что они могут захотеть):

   bool IsAllUpper(string input)
    {
        for (int i = 0; i < input.Length; i++)
        {
            if (Char.IsLetter(input[i]) && !Char.IsUpper(input[i]))
                return false;
        }
        return true;
    }

Ответ 2

Мне нравится подход LINQ.

Если вы хотите ограничить его всеми буквами верхнего регистра (т.е. пробелами и т.д.):

return input.All(c => char.IsUpper(c));

или с использованием преобразования группы методов:

return input.All(char.IsUpper);

Если вы хотите просто запретить строчные буквы:

return !input.Any(c => char.IsLower(c));

или

return !input.Any(char.IsLower);

Ответ 3

Simple?

if (input.ToUpper() == input)
{
    // string is all upper
}

Ответ 4

Убедитесь, что ваше определение заглавной буквы совпадает с определением капитализации .Nets.

ToUpper() в .Net - это лингвистическая операция. В некоторых языках правила капитализации не являются прямыми. Турецкий я знаменит этим.

// Meaning of ToUpper is linguistic and depends on what locale this executes
// This test could pass or fail in ways that surprise you.
if (input.ToUpper() == input) 
{
    // string is all upper
}

Вы можете использовать

// Meaning of ToUpper is basically 'ASCII' ToUpper no matter the locale.
if (input.ToUpper(CultureInfo.InvariantCulture) == input) 
{
    // string is all upper
}

Возможно, у вас возникнет соблазн сохранить память, выполняющую символ за счет капитализации символа

MSDN предупреждает об этом

for(int i = 0; i < input.Length; i++) {
   if(input[i] != Char.ToUpper(input[i], CultureInfo.InvariantCulture)) {
     return false;
   }
}

В приведенном выше коде введена ошибка. Некоторые не английские "буквы" требуют двух символов .net для кодирования (суррогатная пара). Вы должны обнаружить эти пары и использовать их в качестве отдельной единицы.

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

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

Ответ 5

Я бы преобразовал строку во все кепки (с ToUpper), а затем сравнил ее с оригиналом (используя Equals). Должна выполняться в одной строке кода.

return s.Equals(s.ToUpper())

Ответ 6

Используйте

if (input == input.ToUpper())

Ответ 7

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

Ответ 8

Другой подход

return input.Equals(input.ToUpper(), StringComparison.Ordinal)

Ответ 9

Я думаю следующее:

bool equals = (String.Compare(input, input.ToUpper(), StringComparison.Ordinal) == 0)

Будет работать, и вы можете убедиться, что сравнение сделано без учета строкового кода (я думаю, что VB.NET игнорирует регистр по умолчанию). O даже используйте String.CompareOrdinal(input, input.ToUpper()).