2016-05-03 5 views
6

Ich habe zwei Objekte:Switch mit ENUM und mehrere Rückgabe

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

und

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

Und ich würde ein switch case erstellen möchten, wo auf dem BugReportFilter je meiner Ausgabe eine bestimmte BugReportStaus wählen wird .

So habe ich eine Methode CheckFilter

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

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

Das Problem ist, dass im Falle einer BugReportFilter.Open Option sollte ich zurück BugReportStatus.OpenAssignedUNDBugReportStatus.OpenUnassigned, ist es eine Möglichkeit, diese beiden Optionen in einer einzigen Rückkehr zu verketten ?

+0

dann zurück Typ sein '' Wörterbuch '' oder '' Liste '' –

+6

Entweder ein Array als Rückgabeobjekt verwenden oder einen 'Enum' mit' [Flags] 'Attribute verwenden. – Adwaenyth

+0

Der einzige Weg, den ich sehen kann, ist, wenn Sie es "Flags" gemacht haben, aber logisch sind die zwei verschieden, also denke ich, dass das kein guter Weg ist. Es wäre wahrscheinlich am besten, irgendeine Form von mehreren Werten in der Rückgabe zu verwenden, d. h. ein Array, eine Liste oder was Sie haben. – DrewJordan

Antwort

4

Sie könnten IEnumerable<BugReportStatus> zurück:

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

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

Dann könnten Sie Enumerable.Contains verwenden zu überprüfen, ob es F. E. ist BugReportStatus.OpenAssigned:

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

Machen Sie die Optionen Macht von zwei, z.

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

dann zurück Flags.B | Flags.A von Ihrer Funktion (der Rückgabetyp sollte int sein).

Hier ist, wie zu überprüfen, ob Flag

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

Für weitere Informationen eingestellt ist, sehen Sie bitte here.

+0

Dies ist normalerweise eine gute Option, aber ich mag es nicht mit dem Beispiel zur Verfügung gestellt. Wie kann ein Fehler gleichzeitig "zugewiesen" und "nicht zugewiesen" werden? – DrewJordan

+3

Technisch 0 ist keine Potenz von 2. – juharr

+0

@Steve Rückgabetyp besser sein int –

1

was eine zählbare Rückkehr?

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

Für Ihren Fall empfehle ich die Rückkehr in den verschiedenen Bits darzustellen (Konzept der Flaggen verwendet wird), so dass Sie die Rückkehr verketten kann: das man tun könnte

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

So:

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

     case BugReportFilter.Closed: 
      return BugReportStatus.ClosedAsResolved; 
    } 

und ändern Sie Ihre Rückkehr Typ etwas wie int:

private int Checkfilter(BugReportFilter filter) 

Und das Ergebnis außerhalb zu überprüfen, einfach überprüfen, welche Flagge in der int Rückkehr existiert

+0

Ian, gibt es einen Grund, dies auf diese Weise zu tun, anstatt mit Flags? – DrewJordan

+0

@DrewJordan Nein, Sie könnten auch das Attribut 'Flags' verwenden. Das Konzept ist das gleiche. Es ist nur in meinem Code, den Sie nicht Attribut verwenden. – Ian

+0

OK, es kam mir nie in den Sinn, es auf diese Weise selbst zu implementieren, war neugierig, ob es Zeiten gab, in denen dies angemessener wäre. Vielen Dank. – DrewJordan

1

Sie das Flags Attribut verwenden kann, um dies zu erreichen. Um dies zu verwenden, müssen Sie Ihre Enum-Werte für BugReportStatus um Potenzen von 2 erhöhen, da die Enumeration als ein Bitfeld behandelt wird. Sie müssen die Enumeration auch mit dem Attribut [Flags] dekorieren. Z.B.

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

Sie können dann mehrere Werte zurückgeben, wie: return BugReportStatus.OpenAssigned | BugReportStatus.OpenUnassigned;

Sie können die Enum.HasFlags-Methode verwenden, um zu überprüfen, ob ein bestimmtes Bit-Feld gesetzt wurde. Z.B.

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