【发布时间】:2014-02-22 07:38:56
【问题描述】:
我想将内部列表公开为迭代器,因此调用方法将不限于 foreach 循环,但它会随时调用 IEnumerator.Current 和 IEnumerator.MoveNext()。 我尝试了两种方法:
public IEnumerator<string> Iterator
{
get
{
return m_list.GetEnumerator();
}
}
和
public IEnumerator<string> Iterator
{
get
{
for (int i = 0; i < m_list.Count; i++)
{
yield return m_list[i];
}
yield break;
}
}
并且两者都导致测试在以下测试中出现 OutOfMemoryException:
[TestMethod]
public void TestMethod1()
{
var countryCode = "US";
var countryProvider= new CountryProvider(countryCode);
var filteredList = new List<string>();
while(countryProvider.Iterator.MoveNext())
{
filteredList.Add(countryProvider.Iterator.Current);
}
Assert.IsTrue(filteredEFIs.Count > 0);
}
当我尝试调试器时,我注意到每次调用 MoveNext() 时它都会从头开始计数并且 Iterator.Current 始终为空。
【问题讨论】:
-
你能展示完整的 CountryProvider 类吗?
-
是的...不知道你的问题是什么 - 在
while的每次迭代中创建新迭代器的调用方法应该完全按照你的描述行事。 -
为什么不返回
IEnumerable<T>而不是枚举数?实现是一样的,调用者会更简单,而且 - 它会工作! -
您也可以直接返回列表。如果您担心调用者将 ienumerable 向下转换到列表(有些人是,我不是),您可以创建一个 ReadonlyCollection,执行 .ToArray 或 .Select(x => x)。
标签: c# yield-return ienumerator