Как я могу использовать измененную строку в операторе C# switch → case?

У меня есть строка, вариант которой мне нужно использовать во многих местах моего приложения. Например:

String myString = "The Quick Brown Fox";

string someLowerCaseString = myString.ToLower();
string someUpperCaseString = myString.ToUpper();
string someOtherNewString = myString.Replace(' ','+');

У меня есть эта строка в файле Constants.cs, на который я ссылаюсь во всем приложении. Я попробовал два разных подхода:

public const String myString = "The Quick Brown Fox";
public static readonly String myString = "The Quick Brown Fox";

Однако когда я пытаюсь «манипулировать» строкой для использования в инструкции switchcase, я не могу заставить ее работать:

switch(some_value){
    case Constants.myString.ToLower():
    case Constants.myString.ToUpper():
    case Constants.myString.Replace(' ','+'):
}

Я получаю ошибку:

CS0426: The type name 'myString' does not exist in the type 'Constants'

Я даже пробовал это:

String localString = Constants.myString.ToLower();
String localString = Constants.myString.ToUpper();
String localString = Constants.myString.Replace(' ','+');
const String localString = Constants.myString.ToLower();
const String localString = Constants.myString.ToUpper();
const String localString = Constants.myString.Replace(' ','+');
switch(some_value){
    case localString:
}

И это тоже не работает. Я получаю ошибку:

CS9135: A constant value of type 'string' is expected

Я не могу использовать это:

switch(value.ToLower()){
    // ...
}

Иногда мне нужно, чтобы первая буква была заглавной, а иногда мне нужны все буквы в верхнем/строчном регистре.

В официальной документации Microsoft C# говорится, что эти модифицирующие методы возвращают копию строки, поэтому я не думал, что на самом деле манипулирую константой String.

Операторы переключения ожидают постоянных значений, вы не можете switch использовать переменную. Даже если сама строка является константой, функции, которые вы вызываете впоследствии, могут не быть константами. ToLower сам по себе даже не является константой, он может возвращать разные результаты в зависимости от локали.

ipodtouch0218 09.07.2024 19:29

@ ipodtouch0218, поэтому я попробовал это: const var = Constants.myString.ToLower(), которое копирует измененную строку в константу.

Brian 09.07.2024 19:32

Я думаю, вы неправильно понимаете, как работает ключевое слово const в C#. const работает как замена: каждый раз, когда компилятор видит константную переменную, он заменяет ее литеральным значением. const — это функция времени компиляции, вы не можете создать новую переменную const во время выполнения. По этой же причине вы не можете делать такие вещи, как const string x = "abc".ToLower();, потому что ToLower — это функция времени выполнения. Каково было бы значение const, если бы вместо этого было const string x = "abc".ToUppercaseOnMondays()?

ipodtouch0218 09.07.2024 19:37

Что вы на самом деле хотите с этим делать? Расскажите нам о проблеме, которая заставила вас придумать это сломанное решение.

flackoverstow 10.07.2024 00:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Метки регистра должны быть константами, но вы можете использовать:

if (some_value.Equals(myString, StringComparison.CurrentCultureIgnoreCase) ||
    some_value.Equals(myString.Replace(' ', '+'), StringComparison.CurrentCultureIgnoreCase)) {
    // ...
}

Где StringComparison также может быть StringComparison.OrdinalIgnoreCase или StringComparison.InvariantCultureIgnoreCase в зависимости от ваших потребностей.

Этот подход будет работать не только с строчными и прописными буквами, но и со смешанным регистром.


Вы можете заставить оператор переключения работать, если создадите константу myString со всеми символами нижнего регистра, а также добавите вторую константу со знаками +:

const String myString = "the quick brown fox";
const String myStringPlus = "the+quick+brown+fox";

switch (some_value.ToLower()) {
    case myString:
    case myStringPlus:
        // ...
        break;
    // ...
}

Если вы не можете сделать их константами, вам придется вернуться к операторам if-else.

Ответ принят как подходящий

Попробуй это:

using System;

namespace CSharpTests
{
    internal class Constants
    {
        public const String myString = "The Quick Brown Fox";
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            String some_value = Constants.myString.ToLower();
            
            switch (some_value)
            {
                case string s when s == Constants.myString.ToUpper():
                    Console.WriteLine("Is upper");
                    break;
                case string s when s == Constants.myString.ToLower():
                    Console.WriteLine("Is lower");
                    break;
                case string s when s == Constants.myString.Replace(' ', '_'):
                    Console.WriteLine("Is replaced");
                    break;
                default:
                    Console.WriteLine("None of the cases");
                    break;
            }
        }
    }
}

Другие вопросы по теме