powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / foreach по Enum
13 сообщений из 13, страница 1 из 1
foreach по Enum
    #38875222
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Подскажите как реализовать цикл по перечислению в переменной?
дано
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    [Flags]
    public enum OptionConnect
    {
        DISABLE_DEF_CNST_CHK    = 0x00001,
        IMPLICIT_TRANSACTIONS   = 0x00002,
        CURSOR_CLOSE_ON_COMMIT  = 0x00004,
        ANSI_WARNINGS           = 0x00008,
        ANSI_PADDING            = 0x00016,
        ANSI_NULLS              = 0x00032,
        ARITHABORT              = 0x00064,
        ARITHIGNORE             = 0x00128,
        QUOTED_IDENTIFIER       = 0x00256,
        NOCOUNT                 = 0x00512,
        ANSI_NULL_DFLT_ON       = 0x01024,
        ANSI_NULL_DFLT_OFF      = 0x02048,
        CONCAT_NULL_YIELDS_NULL = 0x04096,
        NUMERIC_ROUNDABORT      = 0x08192,
        XACT_ABORT              = 0x16384
    }



в коде надо проверить какие значения принимает переменная
Код: c#
1.
OptionConnect _optionConnnect = (OptionConnect.ANSI_NULL_DFLT_ON | OptionConnect.ANSI_NULLS | OptionConnect.ANSI_PADDING | OptionConnect.ANSI_WARNINGS | OptionConnect.CONCAT_NULL_YIELDS_NULL | OptionConnect.QUOTED_IDENTIFIER | OptionConnect.ARITHABORT);



надо что то вроде
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
foreach (string opt in Enum.GetNames(typeof(OptionConnect)))
                {
                    if(opt.Contains(_optionConnnect.ToString())) // пройти по всем Enum в переменной
                    {
                      cmd.CommandText = string.Format("{0} ON;", opt)
                      cmd.ExecuteNonQuery();
                    }
                }



Гуглил, честно, но все сводиться к банальному
Код: c#
1.
2.
3.
4.
foreach (string opt in Enum.GetNames(typeof(OptionConnect)))
                {
                    Console.WriteLine(opt);
                }



или плюнуть и использовать Array или List (IEnumerable - подобные)?
...
Рейтинг: 0 / 0
foreach по Enum
    #38875225
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
foreach (OptionConnect item in Enum.GetValues(typeof(OptionConnect)))
{
    if (_optionConnnect.HasFlag(item))
    {
        Console.WriteLine(item);
    }
}
...
Рейтинг: 0 / 0
foreach по Enum
    #38875227
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хе-хе...
Код: c#
1.
if( opt == (optionConnnect & opt) )

...
Рейтинг: 0 / 0
foreach по Enum
    #38875229
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И самое главное, это "HasFlag" или "a & b" будут корректно работать, если побитовый сдвиг правильно выставлен у членов енума. А выставлен он у тебя через зад. Вот как надо:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[Flags]
public enum OptionConnect
{
    // NONE = 0,
    DISABLE_DEF_CNST_CHK = 1 << 1,
    IMPLICIT_TRANSACTIONS = 1 << 2,
    CURSOR_CLOSE_ON_COMMIT = 1 << 3,
    ANSI_WARNINGS = 1 << 4,
    ANSI_PADDING = 1 << 5,
    ANSI_NULLS = 1 << 6,
    ARITHABORT = 1 << 7,
    ARITHIGNORE = 1 << 8,
    QUOTED_IDENTIFIER = 1 << 9,
    NOCOUNT = 1 << 10,
    ANSI_NULL_DFLT_ON = 1 << 11,
    ANSI_NULL_DFLT_OFF = 1 << 12,
    CONCAT_NULL_YIELDS_NULL = 1 << 13,
    NUMERIC_ROUNDABORT = 1 << 14,
    XACT_ABORT = 1 << 15
}
...
Рейтинг: 0 / 0
foreach по Enum
    #38875240
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, buser. Спасибо Вам. Завтра проверю.

По поводу криворукости выставления вполне может быть и криво - я это осознаю. Просто это значения этих опций.
В SQL Server @@options . А вот описалово параметров.
например установить ANSI_NULLS=EXEC sys.sp_configure N'user options', N'32'
или получил все параметры
Код: sql
1.
select @@options -- 5496


а в ПО уже разложил.
...
Рейтинг: 0 / 0
foreach по Enum
    #38875245
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, по битовым сдвигам там есть ограничение, вроде 32 бита можно пробежать. Ну для 99% енумов мира этих ваниантов хватит с головой.
...
Рейтинг: 0 / 0
foreach по Enum
    #38875353
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все получилось спасибо ещё раз.
Правда пришлось биты переписать в конечном варианте.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    [Flags]
    public enum OptionConnect
    {
        DISABLE_DEF_CNST_CHK =      0x0001,
        IMPLICIT_TRANSACTIONS =     0x0002,
        CURSOR_CLOSE_ON_COMMIT =    0x0004,
        ANSI_WARNINGS =             0x0008,
        ANSI_PADDING =              0x0010,
        ANSI_NULLS =                0x0020,
        ARITHABORT =                0x0040,
        ARITHIGNORE =               0x0080,
        QUOTED_IDENTIFIER =         0x0100,
        NOCOUNT =                   0x0200,
        ANSI_NULL_DFLT_ON =         0x0400,
        ANSI_NULL_DFLT_OFF =        0x0800,
        CONCAT_NULL_YIELDS_NULL =   0x1000,
        NUMERIC_ROUNDABORT =        0x2000,
        XACT_ABORT =                0x4000 
    }



а тест
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
static void Main(string[] args)
        {
            OptionConnect _optionConnnect = (OptionConnect.ANSI_NULL_DFLT_ON | OptionConnect.ANSI_NULLS | OptionConnect.ANSI_PADDING | OptionConnect.ANSI_WARNINGS | OptionConnect.CONCAT_NULL_YIELDS_NULL | OptionConnect.QUOTED_IDENTIFIER | OptionConnect.ARITHABORT|OptionConnect.XACT_ABORT);
            _optionConnnect = (OptionConnect)21880; // обратная проверка
            Console.WriteLine(_optionConnnect.ToString("d"));
            foreach (OptionConnect s in Enum.GetValues(typeof(OptionConnect)))
            {
                
                if (s == (_optionConnnect & s))
                    Console.WriteLine(s.ToString() + " "+s.ToString("d") + " " + s.ToString("X"));
            }
            Console.ReadKey();
        }
...
Рейтинг: 0 / 0
foreach по Enum
    #38875378
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gdsПравда пришлось биты переписать в конечном варианте.
Да, всё правильно. Всегда так и старайся нумеровать енумы. Многие нумеркуют как попало.

gds
Код: c#
1.
if (s == (_optionConnnect & s))


В FW 4 и выше появился более внятный HasFlag

Код: c#
1.
if (_optionConnnect.HasFlag(s))
...
Рейтинг: 0 / 0
foreach по Enum
    #38875574
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опции можно же и запросом разобрать:
Код: sql
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.
29.
30.
31.
;with cte as (
  select
    row_number() over(order by (select 1)) ord,
    t.name
  from (
    values
      ('DISABLE_DEF_CNST_CHK'),
      ('IMPLICIT_TRANSACTIONS'),
      ('CURSOR_CLOSE_ON_COMMIT'),
      ('ANSI_WARNINGS'),
      ('ANSI_PADDING'),
      ('ANSI_NULLS'),
      ('ARITHABORT'),
      ('ARITHIGNORE'),
      ('QUOTED_IDENTIFIER'),
      ('NOCOUNT'),
      ('ANSI_NULL_DFLT_ON'),
      ('ANSI_NULL_DFLT_OFF'),
      ('CONCAT_NULL_YIELDS_NULL'),
      ('NUMERIC_ROUNDABORT'),
      ('XACT_ABORT')
  ) t(name)
)
select e.name, f1.value, f2.is_on
from cte e
cross apply (
  select power(2, e.ord-1)
)f1(value)
cross apply (
  select case when (f1.value & @@options)=f1.value then 1 else 0 end
)f2(is_on)
...
Рейтинг: 0 / 0
foreach по Enum
    #38875619
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох уж этот магический гавнокод на SQL
...
Рейтинг: 0 / 0
foreach по Enum
    #38875905
Фотография gds
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Разобрать то можно. А вот как хранить их в ПО? каждый раз опрашивать при подключении и если что выставлять? можно, но если заложить уже в ПО меньше запросов к БД. ) Иногда надо менять параметры подключения и смотреть как поведет себя запрос.

В общем рассматривали разные варианты в том числе и этот. В итоге решили остановиться на перечислении и сделать расширенный SqlConnection, параметры сессии это лишь часть изменений.
...
Рейтинг: 0 / 0
foreach по Enum
    #38875976
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВ FW 4 и выше появился более внятный HasFlag

Код: c#
1.
if (_optionConnnect.HasFlag(s))



HasFlag вызывает boxing — в топку его!
...
Рейтинг: 0 / 0
foreach по Enum
    #38876139
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttHasFlag вызывает boxing — в топку его!
HasFlag вызывает InternalHasFlag с MethodImplOptions.InternalCall. А что там внутри - хз. Да и не важно, что там, есть специальный метод - берем и пользуемся.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / foreach по Enum
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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