如何使类可迭代?
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)
myVarWordSimilarity
是 csWordSimilarity
类型。所以我想迭代所有公共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实现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
。以上是关于如何使类可迭代?的主要内容,如果未能解决你的问题,请参考以下文章