2012-02-26 34 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