【问题标题】: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 类以使其像上面那样可迭代。

【问题讨论】:

标签: c# class c#-4.0 iterable


【解决方案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
猜你喜欢
  • 2018-08-31
  • 2020-09-07
  • 1970-01-01
  • 2015-12-09
  • 2021-12-26
  • 2017-12-25
  • 2012-03-23
相关资源
最近更新 更多