2012-02-26 22 views
13

Đây là lớp học của tôiLàm cách nào để tạo lớp học có thể lặp lại?

public class csWordSimilarity 
{ 
    public int irColumn1 = 0; 
    public int irColumn2 = 0; 
    public int irColumn3 = 0; 
    public int irColumn4 = 0; 
    public int irColumn5 = 0; 
} 

Tôi muốn làm cho rằng lớp iterable để được sử dụng như cách dưới đây

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilaritycsWordSimilarity loại. Vì vậy, tôi muốn lặp lại tất cả các biến số int công khai. Tôi cần phải sửa đổi lớp học csWordSimilarity để làm cho nó có thể lặp lại như cách ở trên.

+1

Có lý do nào để bạn không sử dụng 'Danh sách '? Nếu có, hãy xem xét triển khai IEnumerable. –

+0

Vui lòng không thêm "C#" và như vậy vào tên sách của bạn. Đó là những gì các thẻ cho. –

+0

Tham khảo: [Cách sử dụng vòng lặp foreach với các đối tượng tùy chỉnh] (http://stackoverflow.com/a/348977/1004522). Đi qua điều này và nó cũng sẽ giúp bạn hiểu việc sử dụng bất cứ khi nào bạn muốn. –

Trả lời

21

Bạn có thể thực hiện IEnumerable và có ghi đè GetEnumerator trả về một "lặp" qua các biến sử dụng yield tuyên bố

class csWordSimilarity : IEnumerable<int> 
{ 
    private int _var1 = 1; 
    private int _var2 = 1; 
    private int _var3 = 1; 
    private int _var4 = 1; 

    public IEnumerator<int> GetEnumerator() 
    { 
     yield return _var1; 
     yield return _var2; 
     yield return _var3; 
     yield return _var4; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+0

cảm ơn rất nhiều cho câu trả lời mặc dù giải pháp của bạn cho lỗi "Sử dụng loại chung 'System.Collections.Generic.IEnumerator 'yêu cầu 1 đối số loại " – MonsterMMORPG

+1

Bạn đang sử dụng phiên bản .NET nào? Tôi không thể nghĩ ra một cách để tái tạo lỗi đó vì .NET 4 cho phép bạn bỏ qua định nghĩa kiểu mẫu để nó sẽ trở thành một IEnumerable edvaldig

8

Triển khai IEnumerable. Xem Using Iterators (C# Programming Guide)

Trong trường hợp của bạn, bạn chỉ có thể sử dụng được xây dựng trong iterator của một List như vậy:

using System; 
using System.Collections.Generic; 

class csWordSimilarity : IEnumerable<int> { 
    public int irColumn1 = 0; 
    public int irColumn2 = 0; 
    public int irColumn3 = 0; 
    public int irColumn4 = 0; 
    public int irColumn5 = 0; 

    public IEnumerator<int> GetEnumerator() { 
     return (new List<int>() { 
      irColumn1, irColumn2, irColumn3, irColumn4, irColumn5 
     }).GetEnumerator(); 
    } 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { 
     return GetEnumerator(); 
    } 
} 
+0

Có một chi phí đáng kể trong việc khởi tạo một thể hiện danh sách mới với mục đích duy nhất là trả về một điều tra viên của nó, báo cáo lợi nhuận đơn giản hoá điều này và tối ưu hơn. – edvaldig

+0

@edvaldig Tôi nghĩ đó là vấn đề ưu tiên. Nếu bạn định gọi hàng triệu lần này, thì hãy sử dụng 'yield' trực tiếp. Nếu không, tôi thích sử dụng các lớp BCL và đặc biệt là 'Danh sách' ở nơi thuận tiện. –

+0

có tôi sẽ sử dụng nó hàng triệu lần :) Cảm ơn bạn đã đứng đầu edvaldig – MonsterMMORPG

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