切换枚举和多次返回

时间:2016-05-03 14:42:08

标签: c# filter enums switch-statement multiple-return-values

我有两个对象:

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 AND BugReportStatus.OpenUnassigned,有没有办法将这两个选项连接起来一次回归?

5 个答案:

答案 0 :(得分:4)

选项功能为2,例如

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

有关详细信息,请参阅here

答案 1 :(得分:4)

您可以返回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检查它是否为f.e. BugReportStatus.OpenAssigned

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

答案 2 :(得分:3)

对于您的情况,我建议用不同的位表示返回(使用标志的概念),以便您可以连接返回:

<ons-sliding-menu 
ng-show="isMobile"
var="application.slidingmenu"
swipe-target-width="100"
main-page="page1.html" 
menu-page="menu.html"
side="left" 
max-slide-distance="250px">

因此你可以这样做:

<ons-split-view
ng-show="!isMobile"
secondary-page="menu.html"
main-page="page1.html"
main-page-width="85%"
collapse="portrait">

并将您的返回类型更改为<?= isset($user) ? set_value('val',$this->form_validation->val) : set_value('val'); ?>

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; } 返回

中存在的标志

答案 3 :(得分:1)

返回一个可枚举的内容呢?

GNU assembler (GNU Binutils for Ubuntu) 2.26

答案 4 :(得分:1)

您可以使用Flags属性来完成此操作。要使用此功能,您需要将BugReportStatus的枚举值增加2,因为枚举被视为位字段。您还需要使用[Flags]属性修饰枚举。 E.g。

[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