10
votes

Cas d'inverse de tous les caractères alphabétiques en c # chaîne

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


1 commentaires

Remarque: certaines notes d'internationalisation dans ma réponse.


10 Réponses :


21
votes

Vous pouvez le faire dans une ligne avec Linq. Une méthode: xxx


0 commentaires

2
votes

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


0 commentaires

1
votes

Voici une approche de regex: xxx

Vous pouvez utiliser char.parse (m.value) comme alternant à m.value [0] . Aussi, soyez conscient de l'utilisation du toupperinvariant et tolowerinvariant méthodes à la place. Pour plus d'informations, voir cette question: en C # Quel est le Différence entre Toupper () et ToupperInvariant ()?


0 commentaires

7
votes

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


2 commentaires

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 ...



0
votes
        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 commentaires

0
votes

On m'a posé une question similaire hier et ma réponse est comme: xxx

Vous pouvez facilement modifier la signature méthode pour ajouter un paramètre de type cultureinfo , et Utilisez-le avec des méthodes telles que char.ttoupper pour une exigence de mondialisation.


0 commentaires

0
votes

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


0 commentaires

0
votes

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"


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires