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

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

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

Не в квадрат, а умножить на 2 и минус 1.почему минус 1? максимальное значение комбинации флагов - 15, оно меньше 8*2.
Минус 1 это максимальное допустимое (8*2-1=15). Если на меньше сравнивать, то не нужно -1.
...
Рейтинг: 0 / 0
23.09.2019, 13:50
    #39865618
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить значение на соответствие enum
AntonariyВ принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
Enum.GetValues(typeof(MyEnum)).Cast<int>().Max() * 2 - не годится для "дырявого" enum-а (например 0, 1, 2, 4, 32)
...
Рейтинг: 0 / 0
23.09.2019, 14:28
    #39865661
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить значение на соответствие enum
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
23.09.2019, 14:38
    #39865678
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить значение на соответствие enum
LRAntonariyВ принципе, можно возвести максимальное значение в квадрат и проверить, что пришедшее меньше его.
Enum.GetValues(typeof(MyEnum)).Cast<int>().Max() * 2 - не годится для "дырявого" enum-а (например 0, 1, 2, 4, 32)Таких у нас нет и вроде не предвидится, так что пусть будет.
...
Рейтинг: 0 / 0
23.09.2019, 14:56
    #39865697
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить значение на соответствие enum
AntonariyТаких у нас нет и вроде не предвидится, так что пусть будет.А, ну тогда чистая математика, в чем проблема...
...
Рейтинг: 0 / 0
23.09.2019, 15:46
    #39865736
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить значение на соответствие enum
Можно попробовать как-то так:
Код: 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
23.09.2019, 17:16
    #39865795
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить значение на соответствие enum
AntonariyЕсть enum, имеющий атрибут Flags, в нем значения 0, 1, 2, 4, 8. И есть значение 7, которое является корректным результатом 1|2|4, но не является членом enum.

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


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