十进制到二进制位图和 linq
本文关键字:linq 位图 二进制 十进制 | 更新日期: 2024-10-25 22:35:28
我有一个应用程序,它经常使用二进制/十六进制来确定设置是否已启用。这可能是常见的做法,但我是编程新手,所以我不会知道。
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 年,因此列表如果很长)。
编辑
我已经审查了您的所有建议,并在更多谷歌搜索后提出了以下内容。
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]))));
}
它工作正常,看起来还行吗?
您可以使用二进制转换并使用输出。
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
中的 char 以获取启用或禁用的密钥。
我建议以下两个例子之一:
1. 使用带有枚举的标志。
[标志] 枚举属性在 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. 使用配置设置。
您可以改为将所有设置包装在一个类中,而不是像您那样使用 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" />
使用 [Flags] 枚举。
[Flags]
public enum Status
{
Setting1Enabled = 1,
Setting2Enabled = 2,
Setting3Enabled = 4
}
这样,您就可以将 int 解析为支持按位比较的枚举。
要将整数转换为该枚举,请使用Enum.Parse()
Status status = Enum.Parse(typeof(Status), value);
要检查某个值,您可以将其与相应的枚举值进行比较。
我会使用枚举进行设置,并使用按位运算来设置它们并检查是否设置了标志:
[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();
}
}