2016-05-03 17 views
6

Tôi có hai đối tượng:Switch enum và nhiều lợi nhuận

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

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

Và tôi muốn tạo một switch case nơi tùy thuộc vào BugReportFilter chọn đầu ra của tôi sẽ là một cụ BugReportStaus .

Vì vậy, tôi đã tạo ra một phương pháp CheckFilter

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

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

Vấn đề là trong trường hợp của một lựa chọn BugReportFilter.Open tôi nên trở về BugReportStatus.OpenAssignedBugReportStatus.OpenUnassigned, là có một cách để concat hai lựa chọn này trong một sự trở lại đơn ?

+0

sau đó trở về loại có thể được ' 'từ điển' ' hoặc ' 'Danh sách ' ' –

+6

Hoặc sử dụng một mảng như đối tượng trả lại hoặc sử dụng một' Enum' với' [Flags] 'thuộc tính. – Adwaenyth

+0

Cách duy nhất tôi có thể nhìn thấy là nếu bạn làm cho nó 'Cờ', nhưng hợp lý hai là khác biệt, vì vậy tôi nghĩ rằng đó không phải là một cách tốt để đi. sử dụng một số hình thức nhiều giá trị trong lợi nhuận có thể là tốt nhất, tức là một mảng, danh sách hoặc những gì có bạn. – DrewJordan

Trả lời

4

Bạn có thể trở lại 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 }; 
    } 
}; 

Sau đó, bạn có thể sử dụng Enumerable.Contains để kiểm tra xem nó f.e. BugReportStatus.OpenAssigned:

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

Làm cho sức mạnh tùy chọn của hai, ví dụ:

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

sau đó trở về Flags.B | Flags.A từ chức năng của bạn (kiểu trả về nên int).

Sau đây là cách để kiểm tra xem cờ được thiết lập

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

Mọi chi tiết, xin vui lòng xem here.

+0

Đây thường là một lựa chọn tốt, nhưng tôi không thích nó với ví dụ được cung cấp. Làm thế nào một lỗi có thể được 'gán' và 'bỏ gán' cùng một lúc? – DrewJordan

+3

Về mặt kỹ thuật 0 không phải là sức mạnh của 2. – juharr

+0

@Steve Loại trở lại tốt hơn là int –

1

điều gì về việc trả về có thể đếm được?

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

Đối với trường hợp của bạn, tôi khuyên bạn nên để đại diện cho sự trở lại trong bit khác nhau (sử dụng khái niệm về cờ) để bạn có thể concat sự trở lại:

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

Vì vậy bạn có thể làm điều này:

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

     case BugReportFilter.Closed: 
      return BugReportStatus.ClosedAsResolved; 
    } 

Và thay đổi loại trả về của bạn thành một cái gì đó như int:

private int Checkfilter(BugReportFilter filter) 

Và để kiểm tra kết quả bên ngoài, chỉ cần kiểm tra những gì cờ tồn tại trong int trở

+0

Ian, có lý do nào để thực hiện nó theo cách này thay vì bằng cờ không? – DrewJordan

+0

@ DrewJordan no, bạn cũng có thể sử dụng thuộc tính 'Flags'. Khái niệm này là như nhau. Nó chỉ là trong mã của tôi bạn không sử dụng thuộc tính. – Ian

+0

OK, nó không bao giờ xảy ra với tôi để thực hiện nó bản thân mình theo cách này, là tò mò nếu có lần rằng điều này sẽ thích hợp hơn để sử dụng. cảm ơn. – DrewJordan

1

Bạn có thể sử dụng thuộc tính Flags để thực hiện điều này. Để sử dụng điều này, bạn cần phải tăng giá trị enum của bạn cho BugReportStatus bằng quyền hạn của 2 khi enum được coi là một trường bit. Bạn cũng cần phải trang trí enum với thuộc tính [Flags]. Ví dụ.

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

Sau đó bạn có thể trả về nhiều giá trị như: return BugReportStatus.OpenAssigned | BugReportStatus.OpenUnassigned;

Bạn có thể sử dụng phương pháp Enum.HasFlags để kiểm tra xem một trường bit cụ thể đã được thiết lập. Ví dụ.

Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.OpenAssigned) // true 
Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.ClosedAsResolved) // false 
Các vấn đề liên quan