【问题标题】:Workout Int from Booleans来自布尔的 Workout Int
【发布时间】:2011-10-30 03:03:33
【问题描述】:

这就是我想要做的。

我的数据库中有两个位字段:

已归档(位) 删除(位)

我想做的是根据它们的值计算一个 int。

例如,这将在我的模型中:

class Person {

Int32 Status {get;set;}

}

如果 Archived = true 将状态设置为 1,

如果 Deleted = true 将状态设置为 2,

如果两者都为假,则将状态设置为 0。

我想在不使用 If 语句的情况下做到这一点,也许我可以使用某种布尔运算?

【问题讨论】:

  • 两者都不会是真的,它们必须是其中之一。
  • 为什么不使用enum?在我看来enum Status { Normal, Archived, Deleted } 会更容易理解。
  • 好的,我怎么把它写到一个枚举中?

标签: c# asp.net-mvc-3


【解决方案1】:

为什么不使用枚举?

[Flags]
public enum PersonState
{
    None = 0,
    Archived = 1,
    Deleted = 2,
    Both = Archived | Deleted
}

class Person
{
    private PersonState status;

    public PersonState Status
    {
        get { return this.status; }
        set { this.status = value; }
    }

    public bool IsArchived
    {
        get
        {
            return (this.status & PersonState.Archived) != 0;
        }
        set
        {
            if (value)
                this.status |= PersonState.Archived;
            else
                this.status &= ~PersonState.Archived;
        }
    }

    public bool IsDeleted
    {
        get
        {
            return (this.status & PersonState.Deleted) != 0;
        }
        set
        {
            if (value)
                this.status |= PersonState.Deleted;
            else
                this.status &= ~PersonState.Deleted;
        }
    }
}

您可以直接将枚举值转换为整数。

int x = (int)person.Status;

如果你有一个 int,你可以做相反的事情。

person.Status = (PersonState)integerValue;

此外,如果您不提供 Deleted 和 Archived 可以共存的可能性,这实际上是布尔值的可能性。 由 n 个布尔值编码的可能值的数量是 2^n,因此,由于您有 2 个布尔值,因此您有 4 个可能的值,00、01、10 和 11。

问题出在问题本身:用布尔值对信息进行编码是错误的。它应该是一个枚举,在数据库中也只有 3 个可能的值。

【讨论】:

  • 但是 IsArchived 和 IsDeleted 需要从数据库中进行初始设置,我如何将其通过管道传输到作品中?
  • 刚刚编辑,这样您就可以在枚举和布尔属性中进行读写访问。
  • 请注意,在这种情况下,正如我所写的,Both 表示已存档和已删除,而 None 表示未存档且未删除。
  • 如果Both 不是您想要考虑的可能性,我会删除[Flags] 标签、Both 值,并将其保留为枚举。如果您希望同时设置两者,则应仅将其保留为 [Flags]
  • 是的,但问题是,如果您删除标志,如果您尝试使用二进制算术进行写入,您将收到编译器错误,当然,因为它会为您提供不允许的值。在这种情况下,您需要强制转换为整数。问题出在问题本身:在数据库中用布尔值对信息进行编码是错误的,它应该是一个在数据库中也只有 3 个可能值的枚举。
【解决方案2】:

你可以写Convert.ToInt32(Archived) + 2 * Convert.ToInt32(Deleted)

但是,不要。使用ifs 将产生更易读的代码,并且可能也会更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 2016-10-26
    • 1970-01-01
    • 2015-03-05
    • 2012-01-06
    • 2012-01-17
    • 2012-11-04
    • 2012-02-25
    相关资源
    最近更新 更多