Есть ли встроенный IsLowerCase() в .NET?

Есть ли встроенный IsLowerCase() в .NET?


person ripper234    schedule 23.12.2008    source источник
comment
Реализация тривиальна только до тех пор, пока вам не нужно учитывать другие локали...   -  person Roger Lipscombe    schedule 23.12.2008
comment
Это для строки или просто char?   -  person BenAlabaster    schedule 23.12.2008


Ответы (7)


Вы имеете в виду Char.IsLower(ch); ?

person Gant    schedule 23.12.2008

Имейте в виду, что локализация делает этот вопрос нетривиальным. Первый пример хорош, если вам все равно:

string s = ...
s.All(c => char.IsLower(c));

Если вам не все равно, сделайте это следующим образом:

s.ToLower(CultureInfo.CurrentUICulture) == s;

Это дает вам возможность решать вопросы культуры.

person Jay Bazuzi    schedule 23.12.2008
comment
Почему не s.All(c => char.IsLower(c))? - person dalle; 23.12.2008
comment
dalle: Вам нужно сделать String.ToCharArray(), прежде чем вы сможете выполнять лямбда-выражения для символов. То есть bool isStringLower = str.ToCharArray().All(c => char.IsLower(c)); - person Tamas Czinege; 23.12.2008
comment
@DrJokepu: На самом деле, вам не нужно делать ToCharArray(), прежде чем вы сможете сделать лямбду - я только что проверил это, оно отлично работает и со строкой... - person BenAlabaster; 23.12.2008
comment
@DrJokepu: согласно msdn.microsoft.com/en-us /library/ вам это не нужно. - person dalle; 24.12.2008
comment
Ааа, я думаю, что IntelliSense просто подавляет их в строке. Я изменю свой ответ. - person Jay Bazuzi; 24.12.2008

Изменить: не видел фактического смысла вашего вопроса. Вы можете использовать:

char.IsLower(c);

Насколько легко конвертировать между случаями:

Уверенный:

MSDN сообщает:

 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).

person George Stocker    schedule 23.12.2008
comment
Я думаю, что он спрашивает, есть ли функция, которая идентифицирует строку нижнего регистра - person Sergio; 23.12.2008

Как уже упоминалось, вы можете легко сделать это для одного символа, используя 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, потому что в строке есть символы верхнего регистра.

person BenAlabaster    schedule 23.12.2008
comment
достаточно просто вернуть Input.All(c => char.IsLower(c)) и быстрее, поскольку он может вернуться, как только найдет первую букву в верхнем регистре. - person Lucas; 23.12.2008
comment
Ах, хорошо... Никогда не замечал, что можно сделать объект All on a String... спасибо. - person BenAlabaster; 23.12.2008

Как насчет:

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;
        }


    }
person Stever B    schedule 23.12.2008
comment
Многословность в данном случае преднамеренна. И да, я думаю, что asd234as!!!df в нижнем регистре. 2,3,4 и ! по определению вообще не имеют регистра, поэтому используются как нижний, так и верхний регистр. - person Stever B; 23.12.2008

balabaster, пожалуйста, не используйте этот подход с FindAll/Count. Все что тебе нужно это

return Input.ToList().Exists(c => Char.IsUpper(c));

Это остановит итерацию на первом символе верхнего регистра. FindAll создает новый список, и вы используете только свойство Count. Если у нас есть длинная строка в верхнем регистре, вы получите копию исходной строки.

person Petar Petrov    schedule 23.12.2008
comment
@Petrov: .Все (как я использовал) выпадает при первом существовании символа, отличного от нижнего регистра. То, что вы предложили, одинаково многословно. Если вы отбросите ToList().Exists() и вместо этого используете только .All(c => char.IsLower(c)) то вы получите еще лучшие результаты! - person BenAlabaster; 23.12.2008

Ребята, почему это злоупотребление LINQ (ToList (), ToArray (), All (), Any (), ...)? Я тоже люблю LINQ и лямбда-выражения, но в данном случае я думаю, что старый добрый foreach — это то, что нам нужно. Смотрите ответ TcKs в качестве ссылки - но мы можем добиться большего успеха, если удалим лишнее

char.IsLetter( c )

потому что IsLower() выполняет ту же проверку.

person Petar Petrov    schedule 23.12.2008
comment
Потому что хороший .All(c => Char.IsLower(c)) позаботится обо всем... забудьте об итерации по коллекции - просто запросите ее, как если бы вы делали запрос к таблице в базе данных. Гораздо изящнее... - person BenAlabaster; 23.12.2008