Quel est le moyen le plus simple d'inverser le cas de tous les caractères alphabétiques dans une chaîne C #? Par exemple "ABC1 $;" devrait devenir "ABC1 $;" Je pouvais facilement écrire une méthode qui fait cela, mais j'espère qu'il y a une bibliothèque appelée que je ne connais pas cela faciliterait cela. Je voudrais également éviter d'avoir une liste de tous les caractères alphabétiques connus et de comparer chaque caractère à ce qui se trouve dans la liste. Peut-être que cela peut être fait avec des expressions régulières, mais je ne les connais pas très bien. Merci.
Merci pour l'aide. J'ai créé une méthode d'extension de chaîne pour cela qui est principalement inspirée de la solution d'Anthony Pegam, mais sans la Linq. Je pense que cela frappe un bon équilibre entre la lisibilité et la performance. Voici ce que j'ai proposé. P>
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); }
10 Réponses :
Vous pouvez le faire dans une ligne avec Linq. Une méthode:
Vous pouvez le faire vieille école si vous ne connaissez pas 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); }
Voici une approche de regex: Vous pouvez utiliser char.parse (m.value) code> comme alternant à
m.value [0] code>. Aussi, soyez conscient de l'utilisation du
toupperinvariant code> et
tolowerinvariant code> méthodes à la place. Pour plus d'informations, voir cette question: en C # Quel est le Différence entre Toupper () et ToupperInvariant ()? P> P>
Si vous ne vous souciez pas de l'internationalisation:
string input = "aBc1$@[\\]^_{|{~"; 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));
C'est une bonne astuce avec le Xor que beaucoup de gens ne connaissent pas. Toute lettre xored de 32 (0x20) donnera le boîtier inverse.
@Kibbee Merci d'avoir expliqué. Je devrais probablement avoir dans mon post. Quoi qu'il en soit, cette astuce ne fonctionne que pour les vieux personnages ASCII ...
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);
On m'a posé une question similaire hier et ma réponse est comme: Vous pouvez facilement modifier la signature méthode pour ajouter un paramètre de type cultureinfo code>, et Utilisez-le avec des méthodes telles que
char.ttoupper code> pour une exigence de mondialisation. p> p>
Un peu plus vite que quelques autres méthodes énumérées ici et c'est bien parce qu'il utilise 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);
J'ai fait une méthode d'extension pour les chaînes qui ne font que cela!
var hello = "hELLO wORLD"; var helloInverted = hello.Invert(); // helloInverted == "Hello World"
Cela vous aidera davantage .. Parce que je n'ai pas utilisé directement la fonction.
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(); } } }
Code ci-dessous ne fait que 2 appels de fonction à chaque lettre. Au lieu de vérifier si Isletter, nous appliquons simplement Upper / minuscule si nécessaire.
string result=""; foreach (var item in S) { var temp=char.ToLower(item); if (temp != item ) result+= temp; else result+= char.ToUpper(item); }
Remarque: certaines notes d'internationalisation dans ma réponse.