2014-12-04 21 views
2

我試圖解碼位掩碼解碼從值在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編碼的所有設施的列表的功能。

的結果應該是這樣的:

這個屬性有以下設施:

  • 商務中心
  • 健身中心
  • 上網
  • 溫泉水療現場
  • 嬰兒
  • 停車
  • 有無障礙通道
  • 殘障人士專用浴室
  • 游泳池
  • 客房內無障礙設施
  • 盲文或凸起的標誌

我一直在努力的事情像

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」足夠的,而'新'語法來投射可能不起作用 – harold 2014-12-04 13:02:39

+0

新的語法絕對不起作用。你不能創建一個像這樣的枚舉成員的'新'實例 – 2014-12-04 13:06:14

回答

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 2014-12-04 13:22:01

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

這也很好,並遵循我後來的最初想法。謝謝你 – 239revilo 2014-12-04 13:23:14