Câu hỏi Bạn có thể lặp qua tất cả các giá trị enum không? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:
Làm thế nào để liệt kê một enum?  14 câu trả lời

public enum Foos
{
    A,
    B,
    C
}

Có cách nào để lặp qua các giá trị có thể có của Foos?

Về cơ bản?

foreach(Foo in Foos)

1124
2018-06-09 20:25


gốc


Xem thêm stackoverflow.com/questions/105372/c-how-to-enumerate-an-enum - SteveC


Các câu trả lời:


Có, bạn có thể sử dụng ‍GetValue‍‍‍s phương pháp:

var values = Enum.GetValues(typeof(Foos));

Hoặc phiên bản đã nhập:

var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();

Tôi từ lâu đã thêm một chức năng trợ giúp vào thư viện riêng của tôi cho một dịp như vậy:

public static class EnumUtil {
    public static IEnumerable<T> GetValues<T>() {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
}

Sử dụng:

var values = EnumUtil.GetValues<Foos>();

1601
2018-06-09 20:28



Bạn có thể truyền mảng trực tiếp: (T[])Enum.GetValues(typeof(T)) - Şafak Gür
Điều tốt về bình luận của @ ŞafakGür là (1) bạn không phải trải qua một vòng lặp thêm (.Cast<Foos>), và (2) bạn không cần phải bỏ tất cả các giá trị và mở lại chúng. Trích dẫn của Şafak sẽ vẫn hợp lệ miễn là chúng không thay đổi kiểu mảng được trả về một số kiểu khác (như object[]). Nhưng chúng tôi có thể hoàn toàn chắc chắn rằng họ sẽ không vì (a) nó sẽ mất hiệu suất, (b) đã có hàng triệu codelines sử dụng dàn diễn viên của Şafak, và tất cả họ sẽ phá vỡ với một ngoại lệ thời gian chạy. - Jeppe Stig Nielsen
Tất nhiên, có bao nhiêu enums sẽ chứa hơn một chục hoặc hai giá trị? Tôi tưởng tượng rằng trong hầu hết các trường hợp boxing / unboxing là một hit không đáng kể, vì vậy giải pháp sạch nhất là ưu tiên cao nhất. - Jon Coombs
@ JCoombs Tôi thấy điều này đủ sạch: public static IReadOnlyList<T> GetValues<T>() { return (T[])Enum.GetValues(typeof(T)); }. Nhưng vâng, sự khác biệt hiệu suất là không đáng kể trong việc sử dụng phổ biến. Tôi chỉ không thích ý tưởng tạo ra một iterator khi tôi đã có một đối tượng iterumer (enumerable) để trả về. - Şafak Gür
Thật không may, điều này không trả lời câu hỏi đặt ra. Câu hỏi đặt ra là làm thế nào để lặp qua các giá trị của một enum. Slaks trả lời câu hỏi. - JAB


foreach(Foos foo in Enum.GetValues(typeof(Foos)))

671
2018-06-09 20:28



Đây là một giải pháp tuyệt vời. Bằng cách sử dụng "Foos" thay vì "var", hệ thống suy luận kiểu đã có thể sử dụng đúng phiên bản GetValues ​​trả về kiểu đối tượng chính xác. Tốt đẹp! - Robert Patterson
@RobertPatterson Bằng cách sử dụng Foos không có gì được suy luận một cách kỳ diệu. Nó là một diễn viên rõ ràng. - Chiel ten Brinke
@ daveD Tôi muốn nghĩ rằng mọi người có thể xử lý việc viết một khối foreach một mình. - Sinjai


foreach (EMyEnum val in Enum.GetValues(typeof(EMyEnum)))
{
   Console.WriteLine(val);
}

Tín dụng cho Jon Skeet ở đây: http://bytes.com/groups/net-c/266447-how-loop-each-items-enum


93
2018-06-09 20:28





foreach (Foos foo in Enum.GetValues(typeof(Foos)))
{
    ...
}

46
2018-06-09 20:29





CẬP NHẬT
Một thời gian, tôi thấy một bình luận đưa tôi trở lại câu trả lời cũ của mình, và tôi nghĩ tôi sẽ làm điều đó khác đi ngay bây giờ. Những ngày này tôi viết:

private static IEnumerable<T> GetEnumValues<T>()
{
    // Can't use type constraints on value types, so have to do check like this
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException("T must be of type System.Enum");
    }

    return Enum.GetValues(typeof(T)).Cast<T>();
}

26
2018-06-09 20:30



Tại sao sử dụng LINQ "chính xác hơn"? Vui lòng c.f. You can cast the array directly: (T[])Enum.GetValues(typeof(T)) @ SafakGür, phiên bản này có IMO ít chi phí hơn. - Sebastian
làm cho nó đơn giản GetEnumValues ​​<T> () trong đó T: Enum - Saboor Awan
@SaboorAwan không thể sử dụng System.Enum làm ràng buộc tham số kiểu. Trình biên dịch nói: Constraint cannot be special class 'Enum' - Carlos Muñoz
Vâng, đó là lý do tại sao tôi có nhận xét và kiểm tra loại điều đó trong quá trình thực hiện của mình; Tôi đã nghĩ về điều đó. :) - Neil Barnwell
Sổ tay. Trong C # 7.3 bạn có thể sử dụng Enum (cũng như unmanaged và delegate) như các ràng buộc chung. - WBuck


static void Main(string[] args)
{
    foreach (int value in Enum.GetValues(typeof(DaysOfWeek)))
    {
        Console.WriteLine(((DaysOfWeek)value).ToString());
    }

    foreach (string value in Enum.GetNames(typeof(DaysOfWeek)))
    {
        Console.WriteLine(value);
    }
    Console.ReadLine();
}

public enum DaysOfWeek
{
    monday,
    tuesday,
    wednesday
}

20
2018-06-09 20:32





 Enum.GetValues(typeof(Foos))

6
2018-06-09 20:30





Vâng. Sử dụng GetValues() phương pháp trong System.Enum lớp học.


5
2018-06-09 20:28