Как я могу использовать строковое значение перечисления значений C# в операторе выбора?

Решением Вашей проблемы не является создание Ваших собственных итераторов, но использование существующих контейнеров STL и итераторов. Сохраните точки в каждой форме в контейнере как вектор.

class Shape {
    private:
    vector <Point> points;

то, Что Вы делаете с тех пор, зависит от Вашего дизайна. Лучший подход должен выполнить итерации через точки в методах в Форме.

for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
    /* ... */

, Если Вам нужно к точкам доступа вне Формы (это могло бы быть меткой несовершенного дизайна) можно создать в методах Формы, которые возвратятся, функции доступа итератора для точек (в этом случае также создают общедоступное определение типа для контейнера точек). Посмотрите на ответ Konrad Rudolph для деталей этого подхода.

47
задан Dave Clemmer 11 March 2013 в 15:18
поделиться

8 ответов

Перечисление является константой, а результат .ToString () - нет. Что касается компилятора, это динамическое значение. Возможно, вам потребуется преобразовать регистр switch в серию операторов if / else

26
ответ дан 26 November 2019 в 19:07
поделиться

Преобразуйте строку в вашем переключателе в значение перечисления.

(ORDER)Enum.Parse(typeof(ORDER), value, true);
44
ответ дан 26 November 2019 в 19:07
поделиться

В качестве альтернативы использованию if .. else вы можете сначала преобразовать вашу строку в enum . Вероятно, это не имело бы особого смысла, если количество опций невелико:

if (Enum.IsDefined(typeof(ORDER), value))
{
    switch ((ORDER)Enum.Parse(typeof(ORDER), value)
    {
        case ORDER.partial01:
            // ... 
            break;
        case ORDER.partial12:
            // etc
    }
}
else
{
    // Handle values not in enum here if needed
}

* вздох * , если бы был только встроенный T Enum.Parse (строковое значение) , и версия TryParse :)

30
ответ дан 26 November 2019 в 19:07
поделиться

Вы создали это как перечисление по какой-то причине, но на самом деле вы не используете его как перечисление. Почему вы берете значение перечисления и конвертируете его в строку для последующего использования в переключателе вместо того, чтобы просто использовать перечисление?

Вы сказали, что не можете проанализировать это в перечислении, потому что некоторые из значений находятся за пределами диапазон перечисления. Тогда возникает вопрос: «Почему?» В чем смысл перечисления, если вы разрешаете значения, которые не определены? Что вы хотите, чтобы получить значение, которое не определено? Если то же самое для любого неопределенного значения, то вы можете использовать регистр по умолчанию. Если это не так, то вы можете включить дополнительные случаи, которые соответствуют числовому представлению.

Если вы действительно получаете строки обратно, то, вероятно, вы этого не сделаете. Я не хочу использовать перечисление. Вместо этого вы хотите создать общедоступный статический класс, содержащий общедоступные строковые константы, которые затем можно использовать в своем коммутаторе. Хитрость здесь в том, что оценка будет производиться с учетом регистра.

public static class Order
{
   public const string Unknown = "Unknown";
   public const string Partial01 = "Partial01";
   public const string Partial12 = "Partial12";
   public const string Partial23 = "Partial23";
}

string value = Order.Partial01
switch (value)
{
   case Order.Partial01:
      break;

    default:
       // Code you might want to run in case you are
       // given a value that doesn't match.
       break;
}

(Вы также можете очистить корпус.)

12
ответ дан 26 November 2019 в 19:07
поделиться

Это не статическое значение с точки зрения компилятора, поскольку это вызов функции:

ORDER.partial01.ToString()

Следовательно, вы не можете использовать его как сравнение в операторе case. Однако вы можете просто сделать это:

case "partial01"

Это сработает, поскольку значение перечисления и строка идентичны.

1
ответ дан 26 November 2019 в 19:07
поделиться

Не могли бы вы просто вместо этого сказать

case "partial01":

?

1
ответ дан 26 November 2019 в 19:07
поделиться

перечисления постоянны, но ToString () - это функция, возвращающая значение. на основе экземпляра объекта перечисления, для которого он вызывается.

Это два оператора:

ORDER.partial01.ToString()
ORDER.partial02.ToString()

вызывает одну и ту же функцию, но возвращает два разных значения, поэтому вызов функции .ToString () находится внутри себя, а не постоянное значение.

1
ответ дан 26 November 2019 в 19:07
поделиться

Значения перечисления являются константами, но вы пытаетесь использовать результаты метода (ORDER.partial01.ToString ()), а не константу.

На мой взгляд, лучшим вариантом было бы просто переключить это вокруг использования операторов if / else if / else вместо переключателя. Это позволит вам использовать желаемую логику.

В качестве альтернативы, если вы переключите вашу строку на значение перечисления, вы можете напрямую включить значения перечисления. Однако вы не можете включить enum + null + другие строки одним переключателем.

2
ответ дан 26 November 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: