Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / foreach по Enum / 13 сообщений из 13, страница 1 из 1
09.02.2015, 22:30
    #38875222
gds
gds
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
Всем привет.
Подскажите как реализовать цикл по перечислению в переменной?
дано
Код: 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
09.02.2015, 22:39
    #38875225
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
Код: 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
09.02.2015, 22:53
    #38875227
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
хе-хе...
Код: c#
1.
if( opt == (optionConnnect & opt) )

...
Рейтинг: 0 / 0
09.02.2015, 22:57
    #38875229
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
И самое главное, это "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
09.02.2015, 23:22
    #38875240
gds
gds
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
МСУ, buser. Спасибо Вам. Завтра проверю.

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


а в ПО уже разложил.
...
Рейтинг: 0 / 0
09.02.2015, 23:39
    #38875245
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
Кстати, по битовым сдвигам там есть ограничение, вроде 32 бита можно пробежать. Ну для 99% енумов мира этих ваниантов хватит с головой.
...
Рейтинг: 0 / 0
10.02.2015, 08:19
    #38875353
gds
gds
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
все получилось спасибо ещё раз.
Правда пришлось биты переписать в конечном варианте.
Код: 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
10.02.2015, 08:54
    #38875378
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
gdsПравда пришлось биты переписать в конечном варианте.
Да, всё правильно. Всегда так и старайся нумеровать енумы. Многие нумеркуют как попало.

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


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

Код: c#
1.
if (_optionConnnect.HasFlag(s))
...
Рейтинг: 0 / 0
10.02.2015, 11:01
    #38875574
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
Опции можно же и запросом разобрать:
Код: 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
10.02.2015, 11:24
    #38875619
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
Ох уж этот магический гавнокод на SQL
...
Рейтинг: 0 / 0
10.02.2015, 13:59
    #38875905
gds
gds
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foreach по Enum
Сон Веры Павловны,
Разобрать то можно. А вот как хранить их в ПО? каждый раз опрашивать при подключении и если что выставлять? можно, но если заложить уже в ПО меньше запросов к БД. ) Иногда надо менять параметры подключения и смотреть как поведет себя запрос.

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

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



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


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