2014-12-04 2 views
2

я пытаюсь расшифровать BitmaskДекодирование битовой маски из значения в C#

[Flags] 
public enum Amenities 
{ 
    BusinessCenter = 1, 
    FitnessCenter = 2, 
    HotTub = 4, 
    InternetAccess = 8, 
    KidsActivities = 16, 
    Kitchen = 32, 
    PetsAllowed = 64, 
    Pool = 128, 
    Restaurant = 256, 
    Spa = 512, 
    Whirlpool = 1024, 
    Breakfast = 2048, 
    Babysitting = 4096, 
    Jacuzzi = 8192, 
    Parking = 16384, 
    RoomService = 32768, 
    AccessibleTravel = 65536, 
    AccessibleBathroom = 131072, 
    RollShower = 262144, 
    HandicappedParking = 524288, 
    InRoomAccessibility = 1048576, 
    AccessibilityDeaf = 2097152, 
    BrailleSignage = 4194304, 
    FreeAirportShuttle = 8388608, 
    IndoorPool = 16777216, 
    OutdoorPool = 33554432, 
    ExtendedParking = 67108864, 
    FreeParking = 134217728 
} 

Как я пишу функцию, которая декодирует значение, как 5722635 и возвращает список всех удобств, которые кодируются в 5722635.

результат должен выглядеть следующим образом:

Это свойство имеет следующие характеристики:

  • Бизнес-центр
  • Фитнес-центр
  • Доступ в Интернет
  • Доступен Spa на месте
  • Няня
  • Парковка
  • Проезд для людей
  • Доступная ванная комната
  • Передвижной душ
  • In-room Специальные возможности
  • Брайля или рельефные указатели

Я пытался что-то вроде

public List<Amenities> Decode(long mask) 
     { 
      var list = new List<Amenities>(); 
      for (var index = 0; index < 16; index++) 
      { 
       var bit = 1 << index; 
       if (0 != (bit & mask)) 
       { 
        list.Add(new Amenities(index)); 
       } 
      } 
      return list; 
     } 

Но не могу заставить его работать. Любые предложения относительно того, как сделать эту работу должным образом, будут оценены.

+0

16 ISN» t достаточно и что 'новый' синтаксис для броска, вероятно, не работает – harold

+0

новый синтаксис определенно не работает. Вы не можете создать «новый» экземпляр элемента перечисления, подобный этому –

ответ

8

А как насчет однострочного?

var mask = (Amenities)5722635; 

var result = 
    Enum.GetValues(typeof(Amenities)) 
     .Cast<Amenities>() 
     .Where(value => mask.HasFlag(value)) 
     .ToList(); 

Вы можете кэшировать результат Enum.GetValues(typeof(Amenities)).Cast<Amenities>() с целью повышения производительности.

+0

Это простое решение действительно выполнило свою работу ... thanx pwas – 239revilo

1

Во-первых, ваш метод принимает long, но ваш перечисление неявно использует int в качестве базового типа данных. Либо хранить значение как int или изменить базовый тип данных в вашем перечислении в long: [Flags] public enum Amenities : long { ... }

Во-вторых, если перечисление маркируется с FlagsAttribute вы действительно не нужно, чтобы включить значение в список значений , вы можете использовать метод Enum.HasFlag() для проверки отмеченного значения. Вы должны будете отдать свой длинный в Amenities типа первой:

var amenities = (Amenities)mask; 

if (amentities.HasFlag(Amenities.BusinessCenter)) { ... } 

Но, если вы действительно хотите, чтобы разделить этот флаг в список удобств вместо:

public IList<Amenities> Decode(long mask) 
{ 
     var amenities = (Amenities)mask; 
     var list = new List<Amenities>(); 

     foreach (Amenities amenity in Enum.GetValues(typeof(Amenities)) 
     { 
      if (amenities.HasFlag(amenity)) 
       list.Add(amenity); 
     } 

     return list; 
} 
+0

Это также работает очень хорошо и следует за первоначальной идеей, которую я получил после. Спасибо m-y – 239revilo

Смежные вопросы