C#: Перечисление. IsDefined на объединенных флагах

Да, это возможно, например, в этом ответе Я сортирую по свойству v класса IndexValue

    // Sorting by property v using a custom comparator.
    Arrays.sort( array, new Comparator(){
        public int compare( IndexValue a, IndexValue b ){
            return a.v - b.v;
        }
    });

Если вы заметили, что я создавая анонимный внутренний класс (который является Java для замыканий) и передавая его непосредственно методу sort класса Arrays

. Ваш объект может также реализовывать Comparable (вот что такое String и большинство основных библиотек в Java), но это будет определять «естественный порядок сортировки» класса, который он сам, и не позволяет вам подключать новые.

14
задан Svish 9 February 2009 в 09:09
поделиться

4 ответа

С основанными на флаге перечислениями это о наличии небольшого набора или нет. Таким образом для 'ExportFormat', если бит 1 установлен, это - формат CSV, даже при том, что могло бы быть больше набора битов. Имеет бит 1, и 2 устанавливает недопустимое значение? Это субъективно: с точки зрения значений как группа это недопустимо (нет никакого bitpattern, определенного для битов 1 и 2 набора), однако, как каждое значение немного, смотря на них индивидуально, может случиться так, что значение с битами 1 и 2 набора допустимо.

, Если Вы передаете в значении 0011111011, который является допустимым значением? Ну, это зависит от того, что Вы ищете: если Вы смотрите на целое значение, то это - недопустимое значение, но если Вы смотрите на отдельные биты, это хорошо значение: этому установили биты, которые не определяются, но это в порядке, поскольку основанные на флаге перечисления проверяются 'на бит': Вы не сравниваете их со значением, Вы проверяете, установлено ли немного или нет.

Так, поскольку Ваша логика начнет работу, который биты установлены выбрать, какие форматы выбрать, действительно не необходимо проверить, определяется ли перечисление значений: у Вас есть 3 формата: если бит соответствующего формата установлен, формат выбран. Это - логика, которую необходимо записать.

9
ответ дан 24 October 2019 в 05:06
поделиться

Я действовал бы на разрядном уровне и проверке, если весь набор битов в новом значении установлен в Вашем All значение:

if ( ! (All & NewValue) == NewValue )

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

5
ответ дан 24 October 2019 в 05:06
поделиться

См. здесь . Довольно много кода.

0
ответ дан 24 October 2019 в 05:06
поделиться

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

    public T Value
    {
        get { return value; }
        set
        {
            try
            {
                Enum.Parse(typeof(T), value.ToString());
            }
            catch 
            {
                throw new ArgumentOutOfRangeException("value", value, "Value not defined in enum, " + typeof(T).Name);
            }
            if (!this.value.Equals(value))
            {
                this.value = value;

                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                    handler(this, new PropertyChangedEventArgs("Value"));
            }
        }
    }
2
ответ дан 24 October 2019 в 05:06
поделиться
Другие вопросы по тегам:

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