Làm thế nào tôi có thể nhận được số lượng các mục được xác định trong một enum?
Làm thế nào tôi có thể nhận được số lượng các mục được xác định trong một enum?
Câu trả lời:
Bạn có thể sử dụng phương thức tĩnh Enum.GetNames
trả về một mảng biểu thị tên của tất cả các mục trong enum. Thuộc tính độ dài của mảng này bằng với số lượng các mục được xác định trong enum
var myEnumMemberCount = Enum.GetNames(typeof(MyEnum)).Length;
Câu hỏi là:
Làm thế nào tôi có thể nhận được số lượng các mục được xác định trong một enum?
Số lượng "vật phẩm" thực sự có thể có nghĩa là hai thứ hoàn toàn khác nhau. Hãy xem xét ví dụ sau.
enum MyEnum
{
A = 1,
B = 2,
C = 1,
D = 3,
E = 2
}
Số lượng "vật phẩm" được định nghĩa là MyEnum
gì?
Là số lượng mục 5? ( A
, B
, C
, D
, E
)
Hay là 3? ( 1
, 2
, 3
)
Số lượng tên được xác định trong MyEnum
(5) có thể được tính như sau.
var namesCount = Enum.GetNames(typeof(MyEnum)).Length;
Số lượng giá trị được xác định trong MyEnum
(3) có thể được tính như sau.
var valuesCount = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Distinct().Count();
var valuesCount = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Distinct().Count();
.
Default = 1, A4 = 1, Portrate = 1, A4Portrait = 1, Landscape = 2, A4Landscape = 2, ...
;).
Enum.GetValues (typeof (MyEnum)). Chiều dài;
Một mẹo tiện lợi mà tôi đã thấy trong câu trả lời C cho câu hỏi này, chỉ cần thêm một phần tử cuối cùng vào enum và sử dụng nó để cho biết có bao nhiêu phần tử trong enum:
enum MyType {
Type1,
Type2,
Type3,
NumberOfTypes
}
Trong trường hợp bạn đang xác định giá trị bắt đầu khác 0, bạn có thể sử dụng NumberOfTypes - Type1 để xác định số lượng phần tử.
Tôi không chắc liệu phương pháp này có nhanh hơn sử dụng Enum hay không và tôi cũng không chắc liệu nó có được coi là cách thích hợp để làm việc này hay không, vì chúng tôi có Enum để xác định thông tin này cho chúng tôi.
Bạn có thể sử dụng Enum.GetNames để trả về vô số giá trị IE trong enum của bạn và sau đó. Đếm kết quả IEnumerable.
GetNames tạo ra nhiều kết quả tương tự như GetValues nhưng nhanh hơn.
Nếu bạn thấy mình viết giải pháp trên thường xuyên như tôi thì bạn có thể thực hiện nó như một cách chung chung:
public static int GetEnumEntries<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
Tôi đã xem xét điều này ngay bây giờ, và không hài lòng với khả năng đọc của giải pháp hiện tại. Nếu bạn đang viết mã không chính thức hoặc trên một dự án nhỏ, bạn có thể thêm một mục khác vào cuối enum của bạn được gọi là "Độ dài". Bằng cách này, bạn chỉ cần gõ:
var namesCount = (int)MyEnum.Length;
Tất nhiên, nếu những người khác sẽ sử dụng mã của bạn - hoặc tôi chắc chắn trong nhiều trường hợp khác không áp dụng cho tôi trong trường hợp này - giải pháp này có thể là bất cứ nơi nào từ không được khuyên đến khủng khiếp.
Đối với Visual Basic:
[Enum].GetNames(typeof(MyEnum)).Length
đã không làm việc với tôi, nhưng
[Enum].GetNames(GetType(Animal_Type)).length
đã làm.