2010-09-10 43 views
6

Cách đơn giản nhất để đảo ngược trường hợp của tất cả các ký tự chữ cái trong chuỗi C# là gì? Ví dụ: "aBc1 $;" nên trở thành "AbC1 $;" Tôi có thể dễ dàng viết một phương pháp làm điều này, nhưng tôi hy vọng có một cuộc gọi thư viện mà tôi không biết về điều đó sẽ làm cho điều này dễ dàng hơn. Tôi cũng muốn tránh có một danh sách của tất cả các ký tự chữ cái được biết đến và so sánh từng nhân vật với những gì có trong danh sách. Có lẽ điều này có thể được thực hiện với các biểu thức thông thường, nhưng tôi không biết chúng rất rõ. Cảm ơn.Trường hợp ngược của tất cả các ký tự chữ cái trong C# string

Cảm ơn sự giúp đỡ. Tôi tạo ra một phương pháp mở rộng chuỗi cho điều này mà chủ yếu là lấy cảm hứng từ giải pháp Anthony Pegram, nhưng không có LINQ. Tôi nghĩ rằng điều này tạo ra sự cân bằng tốt giữa khả năng đọc và hiệu suất. Đây là những gì tôi nghĩ ra.

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

Lưu ý: một số ghi chú quốc tế hóa trong câu trả lời của tôi. – ErikE

Trả lời

17

Bạn có thể làm điều đó phù hợp với LINQ. Một phương pháp:

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

Tôi thích điều này, cảm ơn! –

+0

@INTPnerd Nếu mọi thứ trở nên chậm chạp, bạn có thể xem xét các phương pháp khác ... – ErikE

1

Bạn có thể làm cũ nếu bạn không biết 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

Dưới đây là một cách tiếp cận regex:

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

Bạn có thể sử dụng Char.Parse(m.Value) như một thay thế để m.Value[0]. Ngoài ra, hãy chú ý đến việc sử dụng các phương pháp ToUpperInvariantToLowerInvariant thay thế. Để biết thêm xem câu hỏi này: In C# what is the difference between ToUpper() and ToUpperInvariant()?

5

Nếu bạn không quan tâm đến quốc tế hóa:

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

Nếu, mặt khác, bạn DO quan tâm đến quốc tế hóa, bạn sẽ muốn vượt qua trong CultureInfo.InvariantCulture để ToUpper() và chức năng ToLower() ...

+2

Đây là một mẹo hay với XOR mà nhiều người không biết. Bất kỳ chữ cái nào XOR bằng 32 (0x20) sẽ sinh ra trường hợp ngược lại. – Kibbee

+0

@Kibbee cảm ơn vì đã giải thích. Tôi có lẽ nên có trong bài viết của tôi. Dù sao, thủ thuật này chỉ hoạt động cho các ký tự ASCII cũ ... – ErikE

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

tôi đã hỏi một câu hỏi tương tự hôm qua và câu trả lời của tôi là như sau:

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

Bạn có thể dễ dàng thay đổi chữ ký phương thức để thêm tham số loại CultureInfo và sử dụng nó với các phương pháp như char.ToUpper để yêu cầu toàn cầu hóa.

0

Nhanh hơn một chút so với một số phương pháp khác được liệt kê ở đây và nó rất tốt vì nó sử dụng Char arithmetics!

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

Tôi đã tạo một phương pháp mở rộng cho các chuỗi chỉ thực hiện việc này!

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

Để sử dụng

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

// helloInverted == "Hello World" 
0

Điều này sẽ giúp bạn nhiều hơn .. vì ở đây tôi đã không sử dụng trực tiếp hoạt động.

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

Tôi chắc chắn điều này cũng sẽ phù hợp với bạn .. Cảm ơn bạn.

Các vấn đề liên quan