switch net enum c# filter enums switch-statement multiple-return-values

c# - net - Switch con enum y retorno mĂșltiple



switch case enum (5)

¿Qué hay de devolver un enumerable?

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

Tengo dos objetos:

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

y

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

Y me gustaría crear una switch case en la que, dependiendo de BugReportFilter mi salida sea un BugReportStaus específico.

Así que creé un método CheckFilter

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

El problema es que en el caso de una opción BugReportFilter.Open debería devolver BugReportStatus.OpenAssigned AND BugReportStatus.OpenUnassigned , ¿hay alguna forma de concaturar estas dos opciones en una sola devolución?


Haga que las opciones tengan la potencia de dos, por ejemplo

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

luego devuelve Flags.B | Flags.A Flags.B | Flags.A desde su función (el tipo de retorno debe ser int ).

Aquí es cómo verificar si se establece el indicador

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

Para más información, mira aquí .


Para su caso, recomiendo representar la devolución en diferentes bits (utilizando el concepto de banderas) para que pueda concat la devolución:

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

Por lo tanto, podrías hacer esto:

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

Y cambie su tipo de devolución a algo así como int :

private int Checkfilter(BugReportFilter filter)

Y para verificar el resultado afuera, simplemente verifique qué bandera existe en el retorno int


Podría devolver 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 }; } };

Entonces podrías usar Enumerable.Contains para verificar si es fe BugReportStatus.OpenAssigned :

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


Puede usar el atributo Flags para lograr esto. Para usar esto, necesitas aumentar tus valores enum para BugReportStatus por potencias de 2 ya que la enumeración se trata como un campo de bit. También necesita decorar la enumeración con el atributo [Flags] . P.ej

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

A continuación, puede devolver varios valores tales como: return BugReportStatus.OpenAssigned | BugReportStatus.OpenUnassigned; return BugReportStatus.OpenAssigned | BugReportStatus.OpenUnassigned;

Puede usar el método Enum.HasFlags para verificar si se ha establecido un campo de bit específico. P.ej

Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.OpenAssigned) // true Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.ClosedAsResolved) // false