2009-11-17 26 views
24

Tôi có một enum (bên dưới) mà tôi muốn có thể sử dụng phương pháp mở rộng LINQ.Các phương pháp mở rộng có thể đếm được trên một Enum

enum Suit{ 
    Hearts = 0, 
    Diamonds = 1, 
    Clubs = 2, 
    Spades = 3 
} 

Enum.GetValues ​​(...) là kiểu trả về Hệ thống. Nhưng tôi dường như không thể truy cập vào tiện ích ToList() hoặc bất kỳ thứ gì khác thuộc loại đó.

Tôi chỉ tìm kiếm để viết một cái gì đó giống như ...

foreach(Suit s in Enum.GetValues(typeof(Suit)).Select(x=>x).Where(x=> x != param)){} 

Có cái gì tôi đang mất tích, hoặc ai đó có thể giải thích cho tôi tại sao điều này là không thể?

Cảm ơn.

Trả lời

41

Enum.GetValues trả về một System.ArraySystem.Array chỉ thực hiện IEnumerable hơn IEnumerable<T> vì vậy bạn sẽ cần phải sử dụng các phương pháp Enumerable.OfType phần mở rộng để chuyển đổi IEnumerable-IEnumerable<Suit> như thế này:

Enum.GetValues(typeof(Suit)) 
      .OfType<Suit>() 
      .Where(x => x != param); 

Edit: tôi loại bỏ các cuộc gọi đến IEnumerable.Select vì nó là một phép chiếu thừa mà không có bất kỳ bản dịch có ý nghĩa nào. Bạn có thể tự do lọc IEnumerable<Suit> được trả về từ OfType<T>.

+1

Tôi có xu hướng thấy 'OfType' phù hợp hơn khi bạn muốn lọc danh sách và' Truyền' để truyền. Có lý do nào để sử dụng 'Int32' thay vì' Suit' không? –

+0

Đối với bất kỳ 'IEnumerable' có chứa các loại đồng nhất, 'OfType ' và 'Cast ' sẽ thực hiện và hoạt động hầu như giống hệt nhau. Đối với việc sử dụng 'Int32' hơn là' Suit' Tôi không thực sự chắc chắn lý do tại sao tôi đã làm điều đó - câu trả lời của tôi đã được sửa chữa. –

+0

Hoạt động giống như tôi đang tìm kiếm. Cảm ơn! – ahawker

7

Thực hiện mảng IEnumerable, do đó bạn sẽ cần phải sử dụng Cast<Suit> hoặc OfType<Suit> để nhận được các tiện ích mở rộng IEnumerble<T> như ToList();

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