2016-04-21 3 views
0

У меня есть приложение, которое много раз использует двоичный/гексагон, чтобы определить, включены ли настройки. Это, вероятно, обычная практика, но я новичок в программировании, поэтому не знаю.Десятичная бинарная битовая карта и linq

Setting 1 = 1 
Setting 2 = 2 
Setting 3 = 4 

Число, указанное в базе данных, будет состоять из всех разрешенных параметров, например. 7. Из этого следует, что все три параметра должны быть активированы, так как сумма равна 7.

Я сделал кортеж, чтобы сообщить, включена ли соответствующая настройка.

public static Tuple<int, string, string, string, string> mytuple(int value) 
    { 
     switch (value.ToString()) 
     { 
      case "1": 
       return new Tuple<int, string, string, string, string>(value, "Disabled", "Disabled", "Disabled", "Enabled"); 
      case "2": 
       return new Tuple<int, string, string, string, string>(value, "Disabled", "Disabled", "Enabled", "Disabled"); 
      case "3": 
       return new Tuple<int, string, string, string, string>(value, "Disabled", "Disabled", "Enabled", "Enabled"); 
      case "4": 
       return new Tuple<int, string, string, string, string>(value, "Disabled", "Enabled", "Disabled", "Disabled"); 
      case "5": 
       return new Tuple<int, string, string, string, string>(value, "Disabled", "Enabled", "Disabled", "Enabled"); 
      case "6": 
       return new Tuple<int, string, string, string, string>(value, "Disabled", "Enabled", "Enabled", "Disabled"); 
      case "7": 
     return new Tuple<int, string, string, string, string>(value, "Disabled", "Enabled", "Enabled", "Enabled");    
      case "8": 
     return new Tuple<int, string, string, string, string>(value, "Enabled", "Disabled", "Disabled", "Disabled"); 
     } 

     return new Tuple<int, string, string, string, string>(0, "", "", "", ""); 
    } 

Мой вопрос, есть более простой способ сделать это, так как его двоичную и входное значение, 7 (двоичное 111), например, может быть получена только в одну сторону, т.е. все 3 настройки включен, или 4 (двоичный код 100), например, один отключенный отключение.

Можно ли сделать способ, чтобы определить, какие биты включены/выключены, вместо этого имеет этот гигантский кортеж (фактический пробег до 2048, поэтому список очень длинный).

EDIT

Я рассмотрел все ваши предложения и придумал следующее после более Googling.

static bool[] bitreader(int input) 
    { 
     int value = input; 

     BitArray b = new BitArray(new int[] { value }); 

     bool[] bits = new bool[b.Count]; 
     b.CopyTo(bits, 0); 

     return bits; 
    } 

    public void getnotitype(int input, out XElement notitype) 
    { 
     bool[] f = bitreader(input); 

     notitype = (new XElement(("NotificationType"), 
       (new XElement("NotifyUsingMessengerService", f[12])), 
       (new XElement("SendEmail", f[13])), 
       (new XElement("RunCustomCommand", f[14])), 
       (new XElement("LogEvent", f[15])))); 
    } 

    public void getnotiact(int input, out XElement notiact) 
    { 
     bool[] f = bitreader(input); 

     notiact = (new XElement(("MessengerEventLog"), 
     (new XElement("LoggingEnabled", f[0])), 
     (new XElement("Severe", f[1])), 
     (new XElement("Warning", f[2])), 
     (new XElement("Informational", f[3])), 
     (new XElement("NotifyUser", f[5])), 
     (new XElement("SendSNMP", f[6])), 
     (new XElement("NotifyAdmin", f[7])), 
     (new XElement("SendToAudit", f[11])))); 
    } 

Его работая нормально, все в порядке?

+2

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

+3

Это злоупотребление кортежем. Я бы не стал распространять такие дополнения с помощью общедоступных методов. Ты не знаешь, что получишь. ** Используйте классы вместо **. Кортежи хороши с коротким временем жизни в методе или с помощью частных методов. –

+0

Лучшим способом сделать это было бы написать класс конфигурации, который инкапсулирует все параметры, где каждая настройка включения/выключения является фактически логической. вам нужно будет написать некоторую форму анализатора, чтобы восстановить конфигурацию из ввода, но это может быть довольно просто _if_ у вас есть фиксированная схема для перевода между числовыми значениями и параметрами configuration.settings. tl; dr: использовать oop, а не подсчет бобов. – garglblarg

ответ

2

Вы можете использовать двоичное преобразование и использовать вывод.

int value = 7; 
int toBase = 2; 

//output is a list of characters with 1's and 0's 
var output = Convert.ToString(value, toBase).ToList(); 
// gives you list of true/false 
var listOfBools = output.Select(x => x=='1'?true:false); 
// gives you list of enabled/disabled string 
var listOfStrings = output.Select(x => x=='1'?"enabled":"disabled"); 

вы можете перебрать полукокс в output, чтобы получить вашу включить или отключить клавишу.

+0

, если вы используете эту строку «get», не содержит определения ToList и никакого метода расширения ToList ...... «Я что-то упустил? –

+0

Добавьте 'using System.Linq;' в разделе использования и повторите попытку – CarbineCoder

0

Используйте перемычку [Флаги].

[Flags] 
public enum Status 
{ 
    Setting1Enabled = 1, 
    Setting2Enabled = 2, 
    Setting3Enabled = 4 
} 

Таким образом вы можете проанализировать свой int на перечисление, которое поддерживает побитовые сравнения.

Чтобы преобразовать целое число в этом перечислении использовать Enum.Parse()

Status status = Enum.Parse(typeof(Status), value); 

А чтобы проверить определенное значение, которое вы можете просто сравнить его с соответствующим значением перечисления.

0

Я бы использовать Enum для настройки и использовать битовые операции, чтобы установить их и проверить, если флаги установлены:

[Flags] 
enum MyEnum 
{ 
    Setting1 = 1, 
    Setting2 = 2, 
    Setting3 = 4, 
    Setting4 = 8 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myEnum = MyEnum.Setting1; 

     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting1)); 
     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting2)); 
     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting3)); 

     myEnum = MyEnum.Setting2; 

     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting1)); 
     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting2)); 
     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting3)); 

     myEnum = MyEnum.Setting2 | MyEnum.Setting3; 

     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting1)); 
     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting2)); 
     Console.WriteLine(myEnum.HasFlag(MyEnum.Setting3)); 

     Console.ReadLine(); 
    } 
} 
+0

Спасибо всем за предложение. Кажется, что Enum это путь. Я еще кое-что прочитаю. –

2

Я хотел бы предложить один из следующих двух примеров:

1. Используйте флаги с Enum.

What does the [Flags] Enum Attribute mean in C#?

Я мог бы написать больше о Флагов здесь, но все флаги-концепция покрыта довольно хорошо в приведенной выше ссылке.

[Flags] 
public enum Setting 
{ 
    Setting1 = 1, 
    Setting2 = 2, 
    Setting3 = 4, 
    Setting4 = 8 
} 

private Setting GetSetting() 
{ 
    Setting foo = Setting.Setting1 | Setting.Setting2 | Setting.Setting3; 
    return foo; 
} 

2. Использование ConfigurationSetting.

Вместо использования Tuple, как вы это делаете, вы можете обернуть все настройки в классе вместо этого. Используя ConfigurationSection, вы также сможете сохранить его в своем приложении/web.config.

public class MySettings : ConfigurationSection 
{ 
    /// <summary> 
    /// Some setting description here... 
    /// </summary> 
    [ConfigurationProperty("setting1", 
     DefaultValue = false, 
     IsRequired = true)] 
    public bool Setting1 
    { 
     get { return (bool)this["setting1"]; } 
    } 
} 

public class Foo 
{ 
    public static MySettings GetSettings() 
    { 
     // Load settings from your configuration. 
     return ConfigurationManager.GetSection("mySettings") as MySettings; 
    } 
} 

И в вашей конфигурации что-то вроде этого:

<configSections> 
    <section name="mySettings" type="YourNameSpace.MySettings, YourAssembly, Version=1.0.0.0, Culture=neutral"></section> 
</configSections> 
<mySettings setting1="true" /> 
Смежные вопросы