У меня есть приложение, которое много раз использует двоичный/гексагон, чтобы определить, включены ли настройки. Это, вероятно, обычная практика, но я новичок в программировании, поэтому не знаю.Десятичная бинарная битовая карта и 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]))));
}
Его работая нормально, все в порядке?
Пожалуйста, обратите внимание Редактирование названия. «Лучший способ сделать это» не дает намека на то, что вы просите. – enkryptor
Это злоупотребление кортежем. Я бы не стал распространять такие дополнения с помощью общедоступных методов. Ты не знаешь, что получишь. ** Используйте классы вместо **. Кортежи хороши с коротким временем жизни в методе или с помощью частных методов. –
Лучшим способом сделать это было бы написать класс конфигурации, который инкапсулирует все параметры, где каждая настройка включения/выключения является фактически логической. вам нужно будет написать некоторую форму анализатора, чтобы восстановить конфигурацию из ввода, но это может быть довольно просто _if_ у вас есть фиксированная схема для перевода между числовыми значениями и параметрами configuration.settings. tl; dr: использовать oop, а не подсчет бобов. – garglblarg