2010-09-10 43 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(); 
     } 
    } 
} 

我相信這也適用於你..謝謝。

相關問題