C# 检测字符串是否全部为大写

C# 检测字符串是否全部为大写,c#,string,C#,String,在C#中,有没有一种方法可以检测字符串是否都是大写的 大多数字符串都很短(即少于100个字符)我会将字符串转换为所有大写字母(使用ToUpper),然后将其与原始字符串进行比较(使用Equals)。在一行代码中应该是可行的 返回s.Equals(s.ToUpper())简单吗 if (input.ToUpper() == input) { // string is all upper } 使用 无需创建新字符串: bool IsAllUpper(string input) {

在C#中,有没有一种方法可以检测字符串是否都是大写的


大多数字符串都很短(即少于100个字符)

我会将字符串转换为所有大写字母(使用
ToUpper
),然后将其与原始字符串进行比较(使用
Equals
)。在一行代码中应该是可行的

返回s.Equals(s.ToUpper())
简单吗

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


无需创建新字符串:

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

    return true;
}
bool IsAllUpper(字符串输入)
{
for(int i=0;i
编辑:如果您想跳过非字母字符(OP的原始实现没有,但他/她的评论表明他们可能想要):

bool IsAllUpper(字符串输入)
{
for(int i=0;i
如果这需要有良好的性能,我假设它经常发生。如果是这样的话,采取你的解决方案,做几百万次,并计时。我怀疑您的解决方案比其他解决方案更好,因为您没有创建一个必须清理的新垃圾收集对象,而且您无法创建一个字符串的副本而不进行迭代。

我认为:

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

也将起作用,并且您可以确保在不考虑管柱套管的情况下进行比较(我认为VB.NET默认情况下忽略大小写)。O甚至使用
String.CompareOrdinal(input,input.ToUpper())
我喜欢LINQ方法

如果要将其限制为所有大写字母(即无空格等):

或使用方法组转换:

return input.All(char.IsUpper);
如果您只想禁止小写字母:

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


我想到了正则表达式。发现了以下问题:

确保您的资本化定义与.NET资本化定义匹配

.Net中的ToUpper()是一种语言操作。在某些语言中,大小写规则并不直接

你可以用

// 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
上面的代码引入了一个bug。一些非英语的“字母”需要两个.net字符来编码(代理项对)。您必须检测这些对,并将它们作为单个单元大写

此外,若您省略了文化信息以获取语言大写,则会引入一个错误,在某些地区,您的自制大写算法和该地区的.net算法不一致

当然,如果您的代码永远不会在讲英语的地区之外运行,或者永远不会收到非英语文本,那么这些都不重要。

另一种方法

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

您还可以调用Windows函数,告诉您字符串的组成

GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, s, s.Length, ref characterTypes);
您为它提供了一个与字符串长度相同的
UInt16
数组,它用标志的按位组合填充每个元素:

  • C1\u大写
    (0x0001):大写
  • C1\u LOWER
    (0x0002):小写
  • C1_位
    (0x0004):十进制数字
  • C1_空格
    (0x0008):空格字符
  • C1\u punt
    (0x0010):标点符号
  • C1\u CNTRL
    (0x0020):控制字符
  • C1_BLANK
    (0x0040):空白字符
  • C1\u XDIGIT
    (0x0080):十六进制数字
  • C1_ALPHA
    (0x0100):任何语言字符:字母、音节或表意文字。有些字符可以是alpha而不是大写或小写
  • C1\u定义的
    (0x0200):定义的字符,但不是其他C1\u*类型之一
因此,如果您检查字符串:

你好,“42”

你会得到结果的

[0x210、0x301、0x382、0x302、0x302、0x302、0x210、0x248、0x210、0x284、0x284、0x210、0x210]

分为:

|            | H | e | l | l | o | , |   | " | 4 | 2 | " | ! |
|------------|---|---|---|---|---|---|---|---|---|---|---|---|
| Defined    | X | X | X | X | X | X | X | X | X | X | X | X |
| Alpha      | x | x | x | x | x |   |   |   |   |   |   |   |
| XDigit     |   | x |   |   |   |   |   |   | x | x |   |   |
| Blank      |   |   |   |   |   |   | x |   |   |   |   |   |
| Cntrl      |   |   |   |   |   |   |   |   |   |   |   |   |
| Punct      |   |   |   |   |   | x |   |   |   |   | x | x |
| Space      |   |   |   |   |   |   | x |   |   |   |   |   |
| Digit      |   |   |   |   |   |   |   |   | x | x |   |   |
| Lower      |   | x | x | x | x |   |   |   |   |   |   |   |
| Upper      | x |   |   |   |   |   |   |   |   |   |   |   |

在循环中,一旦找到小写字符,则无需继续,因为它已通过测试。当它看到非字母(例如标点符号或空格)时,您希望结果是什么?ToUpper解决方案返回true;该问题返回false。如果(!Char.isleter(输入[i])| | Char.IsUpper(输入[i]){etc}与此问题类似:。文化会起作用吗?如果是这样,则接受的答案是不正确的。出于我的目的,当包含非字母字符时,我需要它返回true。所以当它计算ABC1而不是false时,我需要它是真的。我已经尝试了这两种解决方案,在这个例子中,ToUpper更适合我的需要。我很高兴能得到一个简单的最佳答案,可惜你比我抢先一步:(这对像“ABC1”或“*!()”这样的字符串求值为“true”)。我不知道原始的posters上下文,但对于包含非大写字母的字符串,此解决方案肯定会返回“true”。代码越少越好。一种方法是不必要地将其转换为大写,另一种方法是不必要地将一个简单==转换为九行循环函数。如果分析显示有帮助,请进行优化。我建议go使用Toupper不变量()时,此解决方案优于公认的解决方案(IMHO)因为它不需要创建不必要的字符串。可能需要更多的代码行,但这并不总是一件坏事。你赢了一些,你输了一些。我不敢相信接受的答案收到了多少+1。我同意,这个答案比基于.ToUpper()或if(input.All(Char.IsUpper){}的任何答案都好我不明白为什么要有一个10行的函数,当你可以用一行来断言一个简单的正则表达式匹配时…谷歌叔叔告诉我像
newregex(@“[a-Z]+”).IsMatch(input)
应该可以用…或者…检查[a-Z],应该有
// 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;
   }
}
return input.Equals(input.ToUpper(), StringComparison.Ordinal)
GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, s, s.Length, ref characterTypes);
|            | H | e | l | l | o | , |   | " | 4 | 2 | " | ! |
|------------|---|---|---|---|---|---|---|---|---|---|---|---|
| Defined    | X | X | X | X | X | X | X | X | X | X | X | X |
| Alpha      | x | x | x | x | x |   |   |   |   |   |   |   |
| XDigit     |   | x |   |   |   |   |   |   | x | x |   |   |
| Blank      |   |   |   |   |   |   | x |   |   |   |   |   |
| Cntrl      |   |   |   |   |   |   |   |   |   |   |   |   |
| Punct      |   |   |   |   |   | x |   |   |   |   | x | x |
| Space      |   |   |   |   |   |   | x |   |   |   |   |   |
| Digit      |   |   |   |   |   |   |   |   | x | x |   |   |
| Lower      |   | x | x | x | x |   |   |   |   |   |   |   |
| Upper      | x |   |   |   |   |   |   |   |   |   |   |   |