Есть ли встроенный IsLowerCase() в .NET?
Есть ли встроенный IsLowerCase() в .NET?
Ответы (7)
Вы имеете в виду Char.IsLower(ch); ?
Имейте в виду, что локализация делает этот вопрос нетривиальным. Первый пример хорош, если вам все равно:
string s = ...
s.All(c => char.IsLower(c));
Если вам не все равно, сделайте это следующим образом:
s.ToLower(CultureInfo.CurrentUICulture) == s;
Это дает вам возможность решать вопросы культуры.
Изменить: не видел фактического смысла вашего вопроса. Вы можете использовать:
char.IsLower(c);
Насколько легко конвертировать между случаями:
Уверенный:
string upper = "CONVERTED FROM UPPERCASE";
Console.WriteLine(upper.ToLower());
Это часть класса string.
Также есть класс TextInfo:
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
Console.WriteLine(textInfo.ToTitleCase(title));
Console.WriteLine(textInfo.ToLower(title));
Console.WriteLine(textInfo.ToUpper(title));
Что позволяет больше вариаций менять заглавные буквы и еще много чего (например, ToTitleCase).
Как уже упоминалось, вы можете легко сделать это для одного символа, используя char.IsLower(ch)
Но расширить примитив String было бы не очень сложно. Вы можете относительно просто расширить BCL, используя пространство имен Runtime.CompilerServices:
Imports System.Runtime.CompilerServices
Module CustomExtensions
<Extension()> _
Public Function IsLowerCase(ByVal Input As String) As Boolean
Return Return Input.All(Function(c) Char.IsLower(c))
End Function
End Module
Или в С# это будет:
using System.Runtime.CompilerServices;
static class CustomExtensions
{
public static bool IsLowerCase(this string Input)
{
return Input.All(c => char.IsLower(c));
}
}
Теперь вы можете понять это, используя:
Console.WriteLine("ThisIsMyTestString".IsLowerCase())
Что вернет false, потому что в строке есть символы верхнего регистра.
Как насчет:
public bool IsLower(string TestString)
{
if (String.IsNullOrEmpty(TestString))
{
return true;
}
string testlower = TestString.ToLowerInvariant();
if (String.Compare(TestString, testlower, false) == 0)
{
return true;
}
else
{
return false;
}
}
balabaster, пожалуйста, не используйте этот подход с FindAll/Count. Все что тебе нужно это
return Input.ToList().Exists(c => Char.IsUpper(c));
Это остановит итерацию на первом символе верхнего регистра. FindAll создает новый список, и вы используете только свойство Count. Если у нас есть длинная строка в верхнем регистре, вы получите копию исходной строки.
Ребята, почему это злоупотребление LINQ (ToList (), ToArray (), All (), Any (), ...)? Я тоже люблю LINQ и лямбда-выражения, но в данном случае я думаю, что старый добрый foreach — это то, что нам нужно. Смотрите ответ TcKs в качестве ссылки - но мы можем добиться большего успеха, если удалим лишнее
char.IsLetter( c )
потому что IsLower() выполняет ту же проверку.