Bạn miêu tả rõ hơn xí (tốt nhất nên minh họa code chi tiết)
Mình cảm giác đây là câu hỏi hay
Ví dụ mình có
[Flags]
enum test{
t1=1,
t2=2,
t3=4
}
Viết như vậy thì có thể dùng test t=test.t1 | test.t2. Tuy nhiên là giá trị của enum sau luôn phải gấp đôi enum trước nó.
Nhưng như vậy thì nếu ta có quá nhiều enum cần định nghĩa, ví dụ có t99 chẳng hạn thì t99 này sẽ có giá trị vượt ra khỏi các kiểu số của c#. Ai có giải pháp nào cho trường hợp này không.
Bạn miêu tả rõ hơn xí (tốt nhất nên minh họa code chi tiết)
Mình cảm giác đây là câu hỏi hay
Đơn giản là ntn thế này bác ah. Mình cần 1 tùy chọn viết dưới dạng enum, ví dụ
enum options{
op1,
op2
}
H mình muốn chọn các enum & viết dạng ntn: options opt=options.op1 | options.op2;
H làm sao để biết opt có chứa những enum nào.
Google thì ra là dùng attribute Flags, và đặt giá trị cho enum đứng sau có giá trị = 2 lần enum đứng trước, tuy nhiên là nếu cứ gấp đôi thế thì nó vượt ra khỏi phạm vi của int, ulong, long=>khắc phục ntn?
Hiểu rồi, đây đúng là một tình huống hay.
Trong trường hợp này thì không thể sử dụng kiểu enum được, vì:
- giá trị số nguyên yêu cầu của option thứ n (khoảng 100 đi)= 2^n=1267650600228229401496703205376 >> kiểu số nguyên lớn nhất của C# là ulong=18446744073709551615.
- quản lý thế này khá tốn bộ nhớ, vì mỗi số nguyên kiểu ulong chiếm tới 8 bytes = 64 bits
- không thể extend enum vì expert chỉ là kiểu nguyên.
Vì thế mình chuyển sang xử lý bit, cách này đơn giản, xử lý nhanh mà ít tốn kém bộ nhớ.
Hơn hết là có thể extend bao nhiêu phần tử tùy ý mà ko sợ over scope.
Sample mình dùng class BitArrary, bạn tham khảo nhé
Code:class ColorMix { BitArray _colorRange = new BitArray(byte.MaxValue); public void SetColor(Color color, bool isHasThisColor) { //_colorRange[(byte)color] = isHasThisColor; _colorRange.Set((byte)color, isHasThisColor); } ulong public bool GetColor(Color color) { return _colorRange[(byte)color]; } public void Clear() { _colorRange.SetAll(false); } } enum Color : byte { White = byte.MinValue, Blue, Red, ....(Y:DY) Black = byte.MaxValue }
Nếu tạo thêm 1 lớp mới để lưu thì đơn giản tuy nhiên nghe có vẻ k dc tiện cho lắm. KHông biết có cách chính thống nào mà c# hỗ trợ k?
Theo hiểu biết của mình thì là không. Bất cứ điều gì cũng có giới hạn của nó cả mà