Обратный регистр всех буквенных символов в строке C # - PullRequest
7 голосов
/ 10 сентября 2010

Какой самый простой способ изменить регистр всех буквенных символов в строке C #?Например, "aBc1 $;"должен стать "AbC1 $;"Я мог бы легко написать метод, который делает это, но я надеюсь, что есть библиотечный вызов, о котором я не знаю, который облегчит это.Я также хотел бы не иметь список всех известных буквенных символов и сравнивать каждый символ с тем, что находится в списке.Может быть, это можно сделать с помощью регулярных выражений, но я не очень хорошо их знаю.Спасибо.

Спасибо за помощь.Я создал метод расширения строки для этого, который в основном вдохновлен решением Энтони Пеграма, но без 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);
}

Ответы [ 9 ]

18 голосов
/ 10 сентября 2010

Вы можете сделать это в соответствии с 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());
6 голосов
/ 10 сентября 2010

Если вас не волнует интернационализация:

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

Если, с другой стороны, вы ДЕЙСТВИТЕЛЬНО заботитесь о интернационализации, вам нужно передать CultureInfo.InvariantCulture вашим функциям ToUpper () и ToLower () ...

1 голос
/ 10 сентября 2010

Вот подход регулярного выражения:

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].Кроме того, помните об использовании методов ToUpperInvariant и ToLowerInvariant.Для получения дополнительной информации см. Этот вопрос: В C # в чем разница между ToUpper () и ToUpperInvariant ()?

1 голос
/ 10 сентября 2010

Вы можете сделать это в старой школе, если не знаете 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 голосов
/ 17 апреля 2017

Это поможет вам больше .. потому что здесь я не использовал непосредственно функцию.

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 голосов
/ 19 января 2017

Я сделал метод расширения для строк, который делает именно это!

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 голосов
/ 28 июня 2014

Немного быстрее, чем некоторые другие методы, перечисленные здесь, и это хорошо, потому что он использует арифметику 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 голосов
/ 14 октября 2013

Вчера мне задавали аналогичный вопрос, и мой ответ такой:

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 голосов
/ 25 января 2013
        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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...