如何使类可迭代?

Posted

技术标签:

【中文标题】如何使类可迭代?【英文标题】:How do I make a class iterable? 【发布时间】:2012-03-16 08:05:27 【问题描述】:

这是我的课

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)


 

myVarWordSimilaritycsWordSimilarity 类型。所以我想迭代所有公共int 变量。我需要如何修改 csWordSimilarity 类以使其像上面那样可迭代。

【问题讨论】:

您是否有理由不使用List<int>?如果是,那么看看实现 IEnumerable。 参考:How to use foreach loop with custom objects。仔细阅读它,它还将帮助您随时了解使用情况。 【参考方案1】:

您可以实现 IEnumerable 并使用 yield 语句让 GetEnumerator 覆盖在变量上返回一个“迭代器”

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();
    

【讨论】:

非常感谢您的回答,尽管您的解决方案给出了错误“使用泛型类型 'System.Collections.Generic.IEnumerator' 需要 1 个类型参数” 您使用的是哪个版本的 .NET?我想不出一种方法来复制该错误,因为 .NET 4 允许您省略模板类型定义,因此它将成为 IEnumerable 当我尝试这个时,它告诉我 IEnumerable 需要 1 个类型的参数 这太棒了。【参考方案2】:

实现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();
    

【讨论】:

在实例化一个新的 List 实例的唯一目的是返回它的枚举数时有相当大的开销,yield 语句简化了这一点并且更加优化。 @edvaldig 我认为这是一个偏好问题。如果你要调用这个数百万次,那么可以直接使用yield。否则我更喜欢使用 BCL 类,尤其是在方便的情况下使用 List

以上是关于如何使类可迭代?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5.+ - 使类可散列?

如何使我的类可迭代,以便我可以使用 foreach 语法?

如何在 .net 中使类可序列化而无需 Serializable 属性

在 Boost.MPI 中使类可序列化是啥意思?

python通过返回嵌入的可迭代来使类可迭代

自动使类可散列