Тренировка Int от Booleans - PullRequest
       1

Тренировка Int от Booleans

0 голосов
/ 30 октября 2011

Вот что я пытаюсь сделать.

У меня есть две битовые поля в моей базе данных:

Архивировано (бит) Удалено (бит)

Что бы я хотелнравится делать, это вычислять int в зависимости от их значений.

Например, это будет в моей модели:

class Person {

Int32 Status {get;set;}

}

Если Archived = true, установитеstatus = 1,

Если Удалено = true, установите состояние на 2,

Если оба имеют значение false, установите состояние на 0.

Я хочу сделать это без использования операторов If, может быть, есть какая-то логическая арифметика, которую я могу использовать?

Ответы [ 2 ]

5 голосов
/ 30 октября 2011

Почему бы не использовать перечисление?

[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;

Кроме того, если вы не предоставляете возможность того, что Удаленные и Архивные могут сосуществовать вместе, это на самом деле возможно с логическими значениями.Число возможных значений, закодированных n логическими значениями, равно 2 ^ n, поэтому, поскольку у вас есть 2 логических значения, у вас есть 4 возможных значения, 00, 01, 10 и 11.

Проблема в самой проблеме: неправильно кодировать эту информацию с помощью логических значений.Это должно быть перечисление только с 3 возможными значениями также в БД.

2 голосов
/ 30 октября 2011

Вы можете написать Convert.ToInt32(Archived) + 2 * Convert.ToInt32(Deleted).

Однако не .Использование if s приведет к гораздо более читабельному коду и, вероятно, будет немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...