В С# есть ли способ определить, есть ли строка в шапке?
Большинство строк будут короткими (т.е. менее 100 символов)
В С# есть ли способ определить, есть ли строка в шапке?
Большинство строк будут короткими (т.е. менее 100 символов)
Не нужно создавать новую строку:
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;
}
Мне нравится подход 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);
Simple?
if (input.ToUpper() == input)
{
// string is all upper
}
Убедитесь, что ваше определение заглавной буквы совпадает с определением капитализации .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
}
Возможно, у вас возникнет соблазн сохранить память, выполняющую символ за счет капитализации символа
for(int i = 0; i < input.Length; i++) {
if(input[i] != Char.ToUpper(input[i], CultureInfo.InvariantCulture)) {
return false;
}
}
В приведенном выше коде введена ошибка. Некоторые не английские "буквы" требуют двух символов .net для кодирования (суррогатная пара). Вы должны обнаружить эти пары и использовать их в качестве отдельной единицы.
Также, если вы опускаете информацию о культуре для получения лингвистической капитализации, вы вводите ошибку, где в некоторых локалях ваш домашний алгоритм капитализации brew не согласуется с алгоритмом .net для этой локали.
Конечно, ничто из этого не имеет значения, если ваш код никогда не будет работать за пределами англоязычных мест или никогда не получит текст без текста.
Я бы преобразовал строку во все кепки (с ToUpper
), а затем сравнил ее с оригиналом (используя Equals
). Должна выполняться в одной строке кода.
return s.Equals(s.ToUpper())
Используйте
if (input == input.ToUpper())
Если у этого должен быть хороший перфоманс, я предполагаю, что это случается очень часто. Если да, возьмите свое решение и сделайте это несколько миллионов раз и время. Я подозреваю, что у вас есть лучше, чем другие решения, потому что вы не создаете новый собранный мусором объект, который нужно очистить, и вы не можете сделать копию строки, не итерации по ней в любом случае.
Другой подход
return input.Equals(input.ToUpper(), StringComparison.Ordinal)
Я думаю следующее:
bool equals = (String.Compare(input, input.ToUpper(), StringComparison.Ordinal) == 0)
Будет работать, и вы можете убедиться, что сравнение сделано без учета строкового кода (я думаю, что VB.NET игнорирует регистр по умолчанию). O даже используйте String.CompareOrdinal(input, input.ToUpper())
.
Регулярные выражения приходят на ум. Нашли это там: http://en.csharp-online.net/Check_if_all_upper_case_string