2010-05-07 38 views
5

Tôi có một lớp chứa số đối tượng tĩnh. Lớp này cần được thường xuyên 'so sánh' với các lớp khác sẽ là đối tượng List đơn giản.Làm cách nào để triển khai IEnumerable?

public partial class Sheet 
{ 
public Item X{ get; set; } 
public Item Y{ get; set; } 
public Item Z{ get; set; } 
} 

các mục rõ ràng sẽ không phải là "X" "Y" "Z", đó chỉ là tên chung chung chẳng hạn. Vấn đề là do bản chất của những gì cần phải được thực hiện, một danh sách sẽ không hoạt động; mặc dù mọi thứ ở đây sẽ thuộc loại Item. Nó giống như một danh sách kiểm tra những điều rất cụ thể mà phải được kiểm tra trong cả hai mã và thời gian chạy.

Điều này hoạt động tốt và tốt; nó không phải là vấn đề của tôi. Vấn đề của tôi là lặp lại nó. Ví dụ: tôi muốn làm như sau ...

List<Item> UncheckedItems = // Repository Logic Here. 

Bỏ chọnItems chứa tất cả các mục có sẵn; và CheckedItems là cá thể lớp Sheet. CheckedItems sẽ chứa các mục đã được di chuyển từ Bỏ chọn đến Kiểm tra; tuy nhiên do tính chất của hệ thống lưu trữ, các mục được di chuyển đến CÓ THỂ KHÔNG ĐƯỢC TỪ XÓA khỏi Bỏ chọn. Tôi chỉ đơn giản muốn lặp qua "Đã kiểm tra" và xóa mọi thứ khỏi danh sách trong Bỏ chọn đã có trong "Đã kiểm tra".

Vì vậy, tự nhiên, điều đó sẽ giống như thế này với danh sách bình thường.

foreach(Item item in Unchecked) 
{ 
if(Checked.Contains(item)) 
Unchecked.Remove(item); 
} 

Nhưng vì "Trang tính" không phải là 'Danh sách', tôi không thể làm điều đó. Vì vậy, tôi muốn thực hiện IEnumerable để tôi có thể. Bất kỳ đề xuất? Tôi đã không bao giờ thực hiện IEnumerable trực tiếp trước và tôi khá bối rối như để bắt đầu từ đâu.

Trả lời

12

Bạn cần tạo trình lặp mà trả về các mục nằm trong trang tính.

Using Iterators

public partial class Sheet 
{ 
    public Item X{ get; set; } 
    public Item Y{ get; set; } 
    public Item Z{ get; set; } 

    public IEnumerable<Item> EnumerateItems() 
    { 
     yield return X; 
     yield return Y; 
     yield return Z; 
     // ... 
    } 
} 

Nếu bạn không muốn phải gọi phương thức bạn có thể làm điều này.

public partial class Sheet : IEnumerable<Item> 
{ 
    public Item X{ get; set; } 
    public Item Y{ get; set; } 
    public Item Z{ get; set; } 

    public IEnumerator<Item> GetEnumerator() 
    { 
     yield return X; 
     yield return Y; 
     yield return Z; 
     // ... 
    } 

    IEnumerator IEnumerator.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+1

Bạn cũng có thể đặt các báo cáo lợi nhuận đó trực tiếp trong phương pháp GetEnumerator. –

+0

@Steve - Bây giờ điều đó thật tuyệt. – ChaosPandion

+0

@ChaosPandion - Ngay cả khi đối tượng được trả lại thì nó có thể bị xóa như thế nào? Không phải là câu hỏi cũng làm thế nào để loại bỏ các đối tượng? – Prashant

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