2010-06-01 39 views
7

Có thể tạo ra một enum chỉ sử dụng các số trong C# không? Trong chương trình của tôi, tôi có một biến, Gain, chỉ có thể được đặt thành 1, 2, 4 và 8. Tôi đang sử dụng một điều khiển thuộc tính để hiển thị và thiết lập giá trị này. Nếu tôi là để tạo ra một enum như thế này ...Làm cách nào để tạo một enum bằng các số?

private enum GainValues {One, Two, Four, Eight} 

và tôi đã biến tăng của tôi về loại GainValues ​​sau đó danh sách thả xuống trong PropertyGrid sẽ chỉ hiển thị các giá trị có sẵn cho biến tăng. Vấn đề là tôi muốn các giá trị đạt được để đọc số không phải là từ. Nhưng tôi không thể tạo ra một enum như thế này:

private enum GainValues {1,2,4,8} 

Vì vậy, có một cách khác để làm điều này? Có lẽ tạo một loại tùy chỉnh?

Trả lời

15

Đây không phải là cách hoạt động của enums. Một điều tra cho phép bạn đặt tên cho một giá trị cụ thể để bạn có thể tham khảo nó trong mã của bạn một cách hợp lý hơn.

Nếu bạn muốn giới hạn miền có số hợp lệ, enums có thể không phải là lựa chọn đúng. Một thay thế, là chỉ cần tạo ra một tập hợp các giá trị hợp lệ có thể được sử dụng như lợi nhuận:

private int[] ValidGainValues = new []{ 1, 2, 4, 8}; 

Nếu bạn muốn chắc typesafe hơn này, bạn thậm chí có thể tạo ra một kiểu tùy chỉnh với một xây dựng tư nhân, xác định tất cả các giá trị hợp lệ là các cá thể tĩnh, công khai và sau đó hiển thị chúng theo cách đó. Nhưng bạn vẫn sẽ phải cung cấp cho mỗi giá trị hợp lệ một tên - vì trong C# thành viên/tên biến không thể bắt đầu bằng một số (mặc dù chúng có thể chứa chúng).

Bây giờ nếu những gì bạn thực sự muốn, là để gán giá trị cụ thể để mục trong một liệt kê GainValues, mà bạn có thể làm:

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }; 
+0

Bạn có thể muốn thực hiện việc đọc tĩnh này, và có thể là nội bộ hoặc công khai tùy theo yêu cầu phạm vi, nhưng vâng, đây là giải pháp tốt nhất. –

+0

@Cylon Cát: Có, tốt về điểm tĩnh/chỉ đọc, mặc dù trong thực tế, bạn cần nó là một bộ sưu tập như Danh sách hơn là một mảng để thực sự thực thi bất biến. – LBushkin

4
private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 } 

sẽ hoạt động.

Cập nhật: OK, tôi nghĩ tôi đã hiểu lầm bạn ở đó.

Có thể bạn có thể sử dụng KeyValuePair<string, int> và sau đó liên kết tên và giá trị với thuộc tính Khóa và Giá trị tương ứng.

+0

Không rõ ràng rằng đây là những gì OP đang tìm kiếm. Có vẻ như anh ta muốn sử dụng các giá trị bằng chữ số như * tên * của các thành viên điều tra - đó là bất hợp pháp. – LBushkin

+0

@LBushkin: cho mô tả nó là _probably_ những gì OP muốn. –

+0

@ Henk: Tôi không chắc lắm, OP viết: 'Vấn đề là tôi muốn các giá trị đạt được để đọc số không phải là từ. 'Giải thích của tôi là OP muốn một danh sách giới hạn các giá trị hợp lệ cho lợi ích, hơn là một liệt kê có tên. – LBushkin

0

sử dụng phân giá trị rõ ràng trong enum:

private enum GainValues 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Eight = 8 
} 

Sau đó, để liệt kê thông qua các giá trị làm như sau:

GainValues currentVal; 

foreach(currentVal in Enum.GetValues(typeof(GainValues)) 
{ 
    // add to combo box (or whatever) here 
} 

Sau đó, bạn có thể bỏ đi/đến ints khi cần thiết:

int valueFromDB = 4; 

GainValues enumVal = (GainValues) valueFromDB; 

// enumVal should be 'Four' now 
0

Thật không may, các biểu tượng trong C# có thể chứa số, nhưng không thể bắt đầu với số. Vì vậy, bạn sẽ phải sử dụng các từ.

Ngoài ra, bạn có thể làm Gain1, Gain2 vv

Hoặc bạn có thể bỏ qua một enum hoàn toàn và sử dụng hằng số và xử lý nội bộ.

0

Bạn có thể sử dụng một danh sách tùy chỉnh làm nguồn dữ liệu cho danh sách thả xuống của mình.

Mã Đằng sau:

using GainItem = KeyValuePair<string, int>; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<GainItem> dic = new List<GainItem>(); 
      dic.Add(new GainItem("First", 1)); 
      dic.Add(new GainItem("Second", 2)); 
      dic.Add(new GainItem("Fourth", 4)); 
      ddl.DataSource = dic; 
      ddl.DataBind(); 
     } 


    } 

    protected void btn_Click(object sender, EventArgs e) 
    { 
     Response.Write(ddl.SelectedValue); 
    } 
} 

Asp Page:

<div> 
    <asp:DropDownList runat="server" ID="ddl" DataValueField="Value" DataTextField="Key" /> 
    <asp:Button ID="btn" runat="server" OnClick="btn_Click" /> 
    </div> 

Bên cạnh đó, bạn có thể có enum để thiết lập giá trị mặc định, ...

hy vọng điều này giúp

5

Nếu tôi hiểu đúng câu hỏi gốc, câu trả lời có thể là:

Bạn có thể có được con số được liệt kê trong một enum trong thanh tra bằng cách đơn giản sử dụng một tiền tố gạch dưới, ví dụ:

public enum MyNumbers{ _1, _2, _3, _4 }; 
public MyNumbers myNumbers; 

Hy vọng điều này là giúp!

10

Đã có một số lượng lớn câu trả lời cho điều này, tuy nhiên tôi sẽ đưa ra một giải pháp khác. Nếu bạn muốn kiểm soát của bạn hiển thị một số thực tế như trái ngược với từ tiếng Anh cho số trong kiểm soát của bạn, bạn có thể sử dụng chú thích dữ liệu.

using System.ComponentModel.DataAnnotations; 

private enum GainValues 
{ 
[Display(Name = "1")] 
One, 
[Display(Name = "2")] 
Two, 
[Display(Name = "4")] 
Four, 
[Display(Name = "8")] 
Eight 
} 

Điều này rất hữu ích ở bất cứ nơi nào bạn muốn sử dụng tên thân thiện thay cho tên thật của thành viên.

Các vấn đề liên quan