Переключатель с enum и множественным возвратом

У меня есть два объекта:

public enum BugReportStatus
{
    OpenUnassigned = 0,
    OpenAssigned = 1,
    ClosedAsResolved = 2,
    ClosedAsRejected = 3
}

а также

public enum BugReportFilter
{
    Open = 1,
    ...
    Closed = 4,
}

И я хотел бы создать switch case где в зависимости от BugReportFilter выберите мой вывод будет конкретным BugReportStaus,

Итак, я создал метод CheckFilter

private BugReportStatus Checkfilter(BugReportFilter filter)
{
    switch (filter)
    {
        case BugReportFilter.Open:
            return BugReportStatus.OpenAssigned;

        case BugReportFilter.Closed:
            return BugReportStatus.ClosedAsResolved;
    }
};

Проблема в том, что в случае BugReportFilter.Open вариант я должен вернуться BugReportStatus.OpenAssigned А ТАКЖЕ BugReportStatus.OpenUnassignedЕсть ли способ объединить эти два варианта в одном возвращении?

5 ответов

Решение

Вы могли бы вернуться IEnumerable<BugReportStatus>:

private IEnumerable<BugReportStatus> Checkfilter(BugReportFilter filter)
{
    switch (filter)
    {
        case BugReportFilter.Open:
            return new[]{ BugReportStatus.OpenAssigned, BugReportStatus.OpenUnassigned };

        case BugReportFilter.Closed:
            return new[]{ BugReportStatus.ClosedAsResolved };
    }
};

Тогда вы могли бы использовать Enumerable.Contains проверить, если это Fe BugReportStatus.OpenAssigned:

bool isOpenAssigned = Checkfilter(someFiler).Contains(BugReportStatus.OpenAssigned);

Сделайте параметры силой двух, например

public enum Flags
{
    A = 1,
    B = 2,
    C = 4
}

затем вернитесь Flags.B | Flags.A из вашей функции (тип возвращаемого значения должен быть int).

Вот как проверить, установлен ли флаг

bool isA = (enumFlag & Flags.A) != 0; // true means A is set

Для получения дополнительной информации, пожалуйста, смотрите здесь.

Для вашего случая я рекомендую представлять результат в разных битах (используя концепцию флагов), чтобы вы могли согласовать результат:

public enum BugReportStatus
{
    OpenUnassigned = 1, //0000 0001
    OpenAssigned = 2, //0000 0010
    ClosedAsResolved = 4, //0000 0100
    ClosedAsRejected = 8 //0000 1000
}

Таким образом, вы можете сделать это:

    switch (filter)
    {
        case BugReportFilter.Open:
            return BugReportStatus.OpenAssigned + BugReportStatus.OpenUnassigned; //return 3

        case BugReportFilter.Closed:
            return BugReportStatus.ClosedAsResolved;
    }

И измените свой тип возврата на что-то вроде int:

private int Checkfilter(BugReportFilter filter)

И чтобы проверить результат снаружи, просто проверьте, какой флаг существует в int вернуть

Как насчет возврата перечислимого?

private IEnumerable<BugReportStatus> Checkfilter(BugReportFilter filter)
{
    switch (filter)
    {
        case BugReportFilter.Open:
            return new List<BugReportStatus>()
            {
                BugReportStatus.OpenAssigned,
                BugReportStatus.OpenUnassigned
            };

        case BugReportFilter.Closed:
            return new List<BugReportStatus>()
            {
                BugReportStatus.ClosedAsResolved,
                BugReportStatus.ClosedAsRejected
            };

        default: return null;
    }
}

Вы можете использовать атрибут Flags для достижения этой цели. Чтобы использовать это, вам нужно увеличить значения enum для BugReportStatus по степеням 2, поскольку перечисление рассматривается как битовое поле. Вам также нужно украсить перечисление [Flags] приписывать. Например

[Flags]
public enum BugReportStatus
{
    OpenUnassigned = 1,
    OpenAssigned = 2,
    ClosedAsResolved = 4,
    ClosedAsRejected = 8
}

Затем вы можете вернуть несколько значений, таких как: return BugReportStatus.OpenAssigned | BugReportStatus.OpenUnassigned;

Вы можете использовать Enum.HasFlags метод, чтобы проверить, было ли установлено определенное битовое поле. Например

Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.OpenAssigned) // true
Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.ClosedAsResolved) // false
Другие вопросы по тегам