powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверить значение на соответствие enum
14 сообщений из 14, страница 1 из 1
Проверить значение на соответствие enum
    #39865570
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть enum, имеющий атрибут Flags, в нем значения 0, 1, 2, 4, 8. И есть значение 7, которое является корректным результатом 1|2|4, но не является членом enum.

Как в этих условиях проверить, что 7 - корректное значение, соответствующее комбинации флагов? Или 15 - оно включает в себя все флаги, доступные в enum. Только перебрать все значения enum и проверить на and?
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865595
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое, что пришло в голову
Код: c#
1.
2.
      Console.WriteLine((aa)7);
      Console.WriteLine((aa)101);
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865599
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подходит, забыл про еще одно условие: информация об enum имеется в виде Type.

В принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865602
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
Не в квадрат, а умножить на 2 и минус 1.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865606
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле удвоить.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865608
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAntonariyВ принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
Не в квадрат, а умножить на 2 и минус 1.почему минус 1? максимальное значение комбинации флагов - 15, оно меньше 8*2.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865617
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyDima Tпропущено...

Не в квадрат, а умножить на 2 и минус 1.почему минус 1? максимальное значение комбинации флагов - 15, оно меньше 8*2.
Минус 1 это максимальное допустимое (8*2-1=15). Если на меньше сравнивать, то не нужно -1.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865618
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
Enum.GetValues(typeof(MyEnum)).Cast<int>().Max() * 2 - не годится для "дырявого" enum-а (например 0, 1, 2, 4, 32)
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865661
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПервое, что пришло в голову
Код: c#
1.
2.
      Console.WriteLine((aa)7);
      Console.WriteLine((aa)101);

в принципе подходит, но

Код: c#
1.
2.
                result = Enum.ToObject(t, iVal);
                return Enum.IsDefined(t, result);

result для 7 равен E2 | E3 (тоже самое, что (aa)7), но IsDefined возвращает false.

Flags какой-то бестолковый атрибут, судя по описанию, он только и делает, что заставляет ToString перечислять флаги в значении, являющимся их комбинацией.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865678
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRAntonariyВ принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
Enum.GetValues(typeof(MyEnum)).Cast<int>().Max() * 2 - не годится для "дырявого" enum-а (например 0, 1, 2, 4, 32)Таких у нас нет и вроде не предвидится, так что пусть будет.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865697
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТаких у нас нет и вроде не предвидится, так что пусть будет.А, ну тогда чистая математика, в чем проблема...
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865736
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
[Flags]
enum Test
{
  Foo = 1,
  Bar = 2,
  Zot = 4,
  Some = 8,
  Foo1 = 64,
  Bar1 = 256
}
class Program
{
  public static void Main(string[] args)
  {
    var t1 = Test.Bar | Test.Some | Test.Bar1;
    var t2 = (Test)512;
    GetFlags(t1).ToList().ForEach(Console.WriteLine);
    Console.WriteLine("=======================");
    GetFlags(t2).ToList().ForEach(Console.WriteLine);
  }

  static IEnumerable<Enum> GetFlags(Enum input)
  {
    foreach (Enum value in Enum.GetValues(input.GetType()))
      if (input.HasFlag(value))
        yield return value;
  }
}


Во втором примере (с t2) метод GetFlags выдаёт пустую последовательность.
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865795
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЕсть enum, имеющий атрибут Flags, в нем значения 0, 1, 2, 4, 8. И есть значение 7, которое является корректным результатом 1|2|4, но не является членом enum.

Так у тебя все значения будут корректными, которые <= максимальному значению. Если конечно нет дыр типа 0, 1, 2, 4, 32
...
Рейтинг: 0 / 0
Проверить значение на соответствие enum
    #39865824
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
Вернее не максимальному а <= сумма всех остальных
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверить значение на соответствие enum
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]