2012-02-26 61 views
13

這是我的課如何讓一個類可迭代?

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

我要讓下面

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity該類迭代,以喜歡的方式使用爲csWordSimilarity類型。所以我想迭代所有公開的變量。我如何修改csWordSimilarity類,使其像上面的方式一樣迭代。

+1

有沒有原因,你不會使用'List '?如果是,那麼看看實現IEnumerable。 – 2012-02-26 16:58:34

+0

請不要將「c#」等添加到您的標題中。這就是標籤的用途。 – 2012-02-26 17:04:38

+0

參考:[如何使用自定義對象的foreach循環](http://stackoverflow.com/a/348977/1004522)。通過這個,它也將幫助你理解用法。 – 2012-02-26 17:03:14

回答

21

可以實現IEnumerable並具有GetEnumerator的覆蓋返回一個「迭代」在使用中的變量yield陳述

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

非常感謝答案,雖然你的解決方案給出錯誤「使用泛型類型'System.Collections.Generic.IEnumerator '需要1個類型參數「 – MonsterMMORPG 2012-02-26 17:21:32

+1

您使用的是哪個版本的.NET?我想不出一種方法來複制這個錯誤,因爲.NET 4允許你省略模板類型定義,所以它將成爲IEnumerable edvaldig 2012-02-26 20:17:31

8

執行IEnumerable。見Using Iterators (C# Programming Guide)

你的情況,你可以只使用一個List的內置迭代器,像這樣:

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

實例化一個新的List實例的唯一目的是返回它的一個枚舉器,這個yield語句簡化了這個過程,並且是最優的。 – edvaldig 2012-02-26 17:06:45

+0

@edvaldig我認爲這是一個偏好問題。如果你打算打這個數百萬次,那麼是使用直接的「收益率」。否則,我更喜歡使用BCL類,特別是在方便的地方使用List。 – 2012-02-26 17:09:28

+0

是的,我將使用它數百萬次:)謝謝你的頭edvaldig – MonsterMMORPG 2012-02-26 17:16:06