2010-09-10 201 views
6

反转C#字符串中所有字母字符大小写的最简单方法是什么?例如“aBc1 $;”应该变成“AbC1 $;”我可以很容易地编写一个这样做的方法,但我希望有一个我不知道的库调用会使这更容易。我还想避免列出所有已知的字母字符,并将每个字符与列表中的内容进行比较。也许这可以用正则表达式来完成,但我不太了解它们。谢谢。C#字符串中所有字母字符的反向大小写

感谢您的帮助。我为此创建了一个字符串扩展方法,主要受Anthony Pegram解决方案的启发,但没有LINQ。我认为这在可读性和性能之间取得了很好的平衡。这是我想出来的。

public static string SwapCase(this string source) { 
    char[] caseSwappedChars = new char[source.Length]; 
    for(int i = 0; i < caseSwappedChars.Length; i++) { 
     char c = source[i]; 
     if(char.IsLetter(c)) { 
      caseSwappedChars[i] = 
       char.IsUpper(c) ? char.ToLower(c) : char.ToUpper(c); 
     } else { 
      caseSwappedChars[i] = c; 
     } 
    } 
    return new string(caseSwappedChars); 
} 
+0

注:我的答案中有一些国际化笔记。 – ErikE 2010-09-10 01:39:47

回答

17

你可以在LINQ中做到这一点。一种方法:

string input = "aBc1$"; 
string reversedCase = new string(
    input.Select(c => char.IsLetter(c) ? (char.IsUpper(c) ? 
         char.ToLower(c) : char.ToUpper(c)) : c).ToArray()); 
+0

我喜欢这个,谢谢! – 2010-09-10 01:22:27

+0

@INTPnerd如果事情变慢,您可能会考虑其他方法...... – ErikE 2010-09-10 01:34:27

1

如果你不知道LINQ,你可以做到老派。

static string InvertCasing(string s) 
{ 
    char[] c = s.ToCharArray(); 
    char[] cUpper = s.ToUpper().ToCharArray(); 
    char[] cLower = s.ToLower().ToCharArray(); 

    for (int i = 0; i < c.Length; i++) 
    { 
     if (c[i] == cUpper[i]) 
     { 
      c[i] = cLower[i]; 
     } 
     else 
     { 
      c[i] = cUpper[i]; 
     } 
    } 

    return new string(c); 
} 
1

这里有一个正则表达式的方法:

string input = "aBcdefGhI123jKLMo$"; 
string result = Regex.Replace(input, "[a-zA-Z]", 
          m => Char.IsUpper(m.Value[0]) ? 
           Char.ToLower(m.Value[0]).ToString() : 
           Char.ToUpper(m.Value[0]).ToString()); 
Console.WriteLine("Original: " + input); 
Console.WriteLine("Modified: " + result); 

可以使用Char.Parse(m.Value)提供替换m.Value[0]。另外,请注意使用ToUpperInvariantToLowerInvariant方法。欲了解更多信息请参见这个问题:In C# what is the difference between ToUpper() and ToUpperInvariant()?

5

如果你不关心国际化:

string input = "[email protected][\\]^_{|{~"; 
Encoding enc = new System.Text.ASCIIEncoding(); 
byte[] b = enc.GetBytes(input); 
for (int i = input.Length - 1; i >= 0; i -= 1) { 
    if ((b[i] & 0xdf) >= 65 && (b[i] & 0xdf) <= 90) { //check if alpha 
     b[i] ^= 0x20; // then XOR the correct bit to change case 
    } 
} 
Console.WriteLine(input); 
Console.WriteLine(enc.GetString(b)); 

如果,另一方面,你在乎国际化,你要在CultureInfo.InvariantCulture传递给您ToUpper的()和tolower()函数...

+2

这是很多人都不知道的XOR的好方法。任何由32(0x20)异或的字母都会产生相反的情况。 – Kibbee 2010-09-10 01:47:23

+0

@Kibbee感谢您的解释。我可能应该在我的帖子中。无论如何,这个技巧只适用于普通的旧ASCII字符...... – ErikE 2010-09-10 01:59:53

0
 char[] carr = str.ToCharArray(); 
     for (int i = 0; i < carr.Length; i++) 
     { 
      if (char.IsLetter(carr[i])) 
      { 
       carr[i] = char.IsUpper(carr[i]) ? char.ToLower(carr[i]) : char.ToUpper(carr[i]); 
      } 
     } 
     str = new string(carr); 
0

有人问我类似的问题,昨天,我的回答是这样的:

public static partial class StringExtensions { 
    public static String InvertCase(this String t) { 
     Func<char, String> selector= 
      c => (char.IsUpper(c)?char.ToLower(c):char.ToUpper(c)).ToString(); 

     return t.Select(selector).Aggregate(String.Concat); 
    } 
} 

你可以很容易地改变方法签名添加CultureInfo类型的参数,并与像char.ToUpper全球化的要求,方法使用它。

0

一点点比这里列出了一些其它方法速度快,这是不错的,因为它使用char算术!

var line = "someStringToSwapCase"; 

    var charArr = new char[line.Length]; 

    for (int i = 0; i < line.Length; i++) 
    { 
     if (line[i] >= 65 && line[i] <= 90) 
     { 
      charArr[i] = (char)(line[i] + 32); 
     } 
     else if (line[i] >= 97 && line[i] <= 122) 
     { 
      charArr[i] = (char)(line[i] - 32); 
     } 
     else 
     { 
      charArr[i] = line[i]; 
     } 
    } 

    var res = new String(charArr); 
0

我做了一个字符串的扩展方法,这样做!

public static class InvertStringExtension 
{ 
    public static string Invert(this string s) 
    { 
     char[] chars = s.ToCharArray(); 
     for (int i = 0; i < chars.Length; i++) 
      chars[i] = chars[i].Invert(); 

     return new string(chars); 
    } 
} 

public static class InvertCharExtension 
{ 
    public static char Invert(this char c) 
    { 
     if (!char.IsLetter(c)) 
      return c; 

     return char.IsUpper(c) ? char.ToLower(c) : char.ToUpper(c); 
    } 
} 

要使用

var hello = "hELLO wORLD"; 
var helloInverted = hello.Invert(); 

// helloInverted == "Hello World" 
0

这将帮助您更..因为在这里我没有直接使用功能。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Practice 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      char[] new_str = new char[50]; 
      string str; 
      int ch; 
      Console.Write("Enter String : "); 
      str = Console.ReadLine(); 

      for (int i = 0; i < str.Length; i++) 
      { 
       ch = (int)str[i]; 
       if (ch > 64 && ch < 91) 
       { 
        ch = ch + 32; 
        new_str[i] = Convert.ToChar(ch); 
       } 
       else 
       { 
        ch = ch - 32; 
        new_str[i] = Convert.ToChar(ch); 
       } 
      } 
      Console.Write(new_str); 

      Console.ReadKey(); 
     } 
    } 
} 

我相信这也适用于你..谢谢。

相关问题