十进制到二进制位图和 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]))));
    }

它工作正常,看起来还行吗?

十进制到二进制位图和 linq

您可以使用二进制转换并使用输出。

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();
    }
}