C# IEnumerator<;字符串>;。当前返回值始终为空

C# IEnumerator<;字符串>;。当前返回值始终为空,c#,yield-return,ienumerator,C#,Yield Return,Ienumerator,我想将内部列表公开为迭代器,这样调用方法就不会局限于foreach循环,而是在需要时调用IEnumerator.Current和IEnumerator.MoveNext()。 我尝试了两种方法: public IEnumerator<string> Iterator { get { return m_list.GetEnumerator(); } } 公共IEnumerator迭代器 { 收到 { 返回m_list.GetEnumerator

我想将内部列表公开为迭代器,这样调用方法就不会局限于foreach循环,而是在需要时调用IEnumerator.Current和IEnumerator.MoveNext()。 我尝试了两种方法:

public IEnumerator<string> Iterator
{
    get
    {
        return m_list.GetEnumerator();
    }
}
公共IEnumerator迭代器 { 收到 { 返回m_list.GetEnumerator(); } } 及

公共IEnumerator迭代器 { 收到 { 对于(int i=0;i 在以下测试中,这两种情况都会导致测试发生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);        
}
[TestMethod]
公共void TestMethod1()
{
var countryCode=“美国”;
var countryProvider=新的countryProvider(countryCode);
var filteredList=新列表();
while(countryProvider.Iterator.MoveNext())
{
添加(countryProvider.Iterator.Current);
}
Assert.IsTrue(filterefis.Count>0);
}

当我尝试调试器时,我注意到每次调用都进入MoveNext()它从零开始计数并使用迭代器。当前值始终为null。

问题是每次调用
迭代器
属性时,您都会创建新的
枚举器
,因此
while
循环和
Add
调用将新迭代器重置为起始状态(因此
当前的
属性为
null

正确的代码是

var iterator = countryProvider.Iterator;
while(iterator.MoveNext())
   {
       filteredList.Add(iterator.Current);
   }

我认为这部分是由于传统观念造成的,即无论人们如何称呼房产,房产都会返回“廉价且相同”的价值。另一方面,“GetXXXXX”方法期望返回在调用之间可能发生变化的内容。您可以在
IEnumerable
上看到该模式,它通过方法()提供迭代器鼓励存储值并使用它。

问题是每次调用
迭代器
属性时都会创建新的
枚举器
,因此
while
循环和
Add
调用将新迭代器重置为开始状态(因此
Current
null

正确的代码是

var iterator = countryProvider.Iterator;
while(iterator.MoveNext())
   {
       filteredList.Add(iterator.Current);
   }

我认为这部分是由于传统观念造成的,即无论人们如何称呼房产,房产都会返回“廉价且相同”的价值。另一方面,“GetXXXXX”方法期望返回在调用之间可能发生变化的内容。您可以在
IEnumerable
上看到该模式,它通过方法()提供迭代器,鼓励您存储值并使用它。

感谢您解释实例的问题。我提供了一个解决方案,该解决方案不会中断调用者并控制提供者类中迭代器的实例。我的场景假设调用者知道两件事——当它启动会话时,以及当它需要下一项时,从这里开始,其他的在调用者内部保留迭代器(稍微中断实现)或在本地缓存它,除非故意重置,这不会中断当前调用者实现(如下所示)。另一种方法是使用decorator模式包装内部枚举器(如下所示)

private IEnumerator m_迭代器;
公共字符串迭代器
{
收到
{
if(this.m_迭代器==null)
{
这是ResetIterator();
}
返回此.m_迭代器.MoveNext();
}
}
公共无效重置迭代器()
{
this.m_iterator=this.m_internalIterator();
}
私有IEnumerator m_internalIterator()
{
对于(int i=0;i
通过decorator模式,给定我的提供程序类型实现IEnumerator:

private IEnumerator<string> m_iterator;

public bool MoveNext()
{
    if (this.m_iterator == null)
    {
        this.ResetIterator();
    }
    return this.m_iterator.MoveNext();        
}

public string Current
{
    get
    {
        if (this.m_iterator == null)
        {
            this.Reset();
        }
        return this.m_iterator.Current;
    }
}

public void Reset()
{
    this.m_iterator = this.m_internalIterator();
}

private IEnumerator<string> m_internalIterator()
{
    for (int i = 0; i < m_list.Count; i++)
    {
        yield return m_list[i];
    }
    yield break;
}
private IEnumerator m_迭代器;
公共图书馆
{
if(this.m_迭代器==null)
{
这是ResetIterator();
}
返回此.m_迭代器.MoveNext();
}
公共字符串电流
{
收到
{
if(this.m_迭代器==null)
{
这是Reset();
}
返回this.m_iterator.Current;
}
}
公共无效重置()
{
this.m_iterator=this.m_internalIterator();
}
私有IEnumerator m_internalIterator()
{
对于(int i=0;i
感谢您解释实例的问题。我提供了一个解决方案,该解决方案不会中断调用者并控制提供者类中迭代器的实例。我的场景假设调用者知道两件事——当它启动会话时,以及当它需要下一项时,从这里开始,其他的在调用者内部保留迭代器(稍微中断实现)或在本地缓存它,除非故意重置,这不会中断当前调用者实现(如下所示)。另一种方法是使用decorator模式包装内部枚举器(如下所示)

private IEnumerator m_迭代器;
公共字符串迭代器
{
收到
{
if(this.m_迭代器==null)
{
这是ResetIterator();
}
返回此.m_迭代器.MoveNext();
}
}
公共无效重置迭代器()
{
this.m_iterator=this.m_internalIterator();
}
私有IEnumerator m_internalIterator()
{
对于(int i=0;i
通过decorator模式,给定我的提供程序类型实现IEnumerator:

private IEnumerator<string> m_iterator;

public bool MoveNext()
{
    if (this.m_iterator == null)
    {
        this.ResetIterator();
    }
    return this.m_iterator.MoveNext();        
}

public string Current
{
    get
    {
        if (this.m_iterator == null)
        {
            this.Reset();
        }
        return this.m_iterator.Current;
    }
}

public void Reset()
{
    this.m_iterator = this.m_internalIterator();
}

private IEnumerator<string> m_internalIterator()
{
    for (int i = 0; i < m_list.Count; i++)
    {
        yield return m_list[i];
    }
    yield break;
}
private IEnumerator m_迭代器;
公共图书馆
{
if(this.m_迭代器==null)
{
这是ResetIterator();
}
返回此.m_迭代器.MoveNext();
}
公共字符串电流
{
收到
{
if(this.m_迭代器==null)
{
这是Reset();
}
返回this.m_iterator.Current;
}
}
公共无效重置()
{
this.m_iterator=this.m_internalIterator();
}
私有IEnumerator m_internalIterator()
{
对于(int i=0;i
能否显示完整的CountryProvider类?是的。。。不确定您的问题调用方法是什么,它在