Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Flags]Enum, Найти пересечения 
:(
    Опции темы
ДобренькийПапаша
Дата 18.5.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Через метод получаю некий код, представленный как int.
Есть перечисление c атрибутом Flags, каждому имени в перечислении соответствует конкретное int значение.

Мне нужно найти пересечение пунктов перечисления, которые дают в результате тот самый, полученный в начале через метод код (он является пересечением каких-то значений из перечисления).

Код

[Flags]
    public enum ReturnCode
    {
    FailureAlarm = 8192,
        ErrorCardBinIsFull = 4096,
        CardIsDispensing = 2048,
        CardIsCapturing = 1024,
        CardDispenseError = 512,
        CardCaptureError = 256,
        NoCapture = 128,
    CardPreEmpty = 16
//Ещё десяток значений
}


Нужно найти то, из каких пунктов перечисления (их пересечение) состоит полученный через метод код и вывести одно за другим эти пункты перечисления.

Например, если я через метод получаю значение 272, то этот код означает пересечение пунктов CardCaptureError и CardPreEmpty, т.е. 256 | 16. Надо вывести на консоль соотвественно CardCaptureError и CardPreEmpty.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Ky7m
Дата 18.5.2011, 20:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 8.4.2008

Репутация: 1
Всего: 2



Ну можно на возвращаемый результат накладывать маску и смотреть наличие определенного значения.
То есть 272 = 0000 0001 0001 0000 
             16   = 0000 0000 0001 0000
             256 = 0000 0001 0000 0000

Побитовое И вернет 1 если есть пересечение.
PM MAIL ICQ   Вверх
-Mikle-
Дата 19.5.2011, 07:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Просто приведи тип int к типу ReturnCode.

Код

int numCode = 272;
ReturnCode retCode = (ReturnCode)numCode;
Console.WriteLine(retCode.ToString()); // выведет строку "CardCaptureError, CardPreEmpty"

Проверить наличие флага можно так:
Код

if( (retCode & ReturnCode.CardCaptureError) == ReturnCode.CardCaptureError ) { ...... }

Получить список выставленных флагов:
Код

int numCode = 272;
ReturnCode retCode = (ReturnCode)numCode;
List<ReturnCode> result = new List<ReturnCode>();
foreach (ReturnCode flag in Enum.GetValues(typeof(ReturnCode)))
    if ((retCode & flag) == flag)
        result.Add(flag);
// после выполнения в result будет два флага.

Чтобы упростить себе жизнь, если ты это часто используешь, напиши extension-метод для Enum и используй с любым перечислением.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0399 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.