C#-IEnumerable<&燃气轮机;StackOverFlowException(AVLTree)

C#-IEnumerable<&燃气轮机;StackOverFlowException(AVLTree),c#,ienumerable,avl-tree,C#,Ienumerable,Avl Tree,我在使用IEnumerable 我正在读取CSV文件,我对get/set方法进行了排序,并在实现IEnumerable之前测试了代码,并且自动/局部正确显示 我试图在DataGridView中显示CSV文件的内容 foreach (Country country in avlTree) { displayCountriesDataGridView.Rows.Add(country.CountryName, co

我在使用
IEnumerable

我正在读取CSV文件,我对get/set方法进行了排序,并在实现
IEnumerable
之前测试了代码,并且自动/局部正确显示

我试图在DataGridView中显示CSV文件的内容

foreach (Country country in avlTree)
                    {

                      displayCountriesDataGridView.Rows.Add(country.CountryName, country.GDPGrowth, country.Inflation, country.TradeBalance, country.HDIRank, country.TradingPartners);

                    }
使用一个AVLTree和
插入项
方法,我编写了将这些数据附加到AVLTree的方法

  avlTree.InsertItem(tempCountry);
当我使用:

class AVLTree<T> : BSTree<T>, IEnumerable<Country> where T : IComparable
我得到一个红色的十字架,名字
this
的值为
无法读取内存

类型变量T
的值为
系统。uu Canon

我在我的Country类中实现了
IEnumerable
,没有问题

我只是不明白是什么导致了这个问题

有没有人能提供一些指导或说明这件事

多谢各位

编辑-我的AVLTree的实现

   class AVLTree<T> : BSTree<T>, IEnumerable<Country> where T : IComparable
    {

        Node<T> newRoot;



        public new void InsertItem(T item)
        {
            insertItem(item, ref root);
        }



        private void insertItem(T item, ref Node<T> tree)
        {
            if (tree == null)
            {
                tree = new Node<T>(item);
            }

            else if (item.CompareTo(tree.Data) < 0)
            {
                insertItem(item, ref tree.Left);
            }
            else if (item.CompareTo(tree.Data) > 0)
            {
                insertItem(item, ref tree.Right);
            }

            tree.BalanceFactor = Height(ref tree.Left) - Height(ref tree.Right);

            if (tree.BalanceFactor <= -2)
            {
                rotateLeft(ref tree);
            }
            if (tree.BalanceFactor >= 2)
            {
                rotateRight(ref tree);
            }
        }




        private void rotateRight(ref Node<T> tree)
        {
            if (tree.Left.BalanceFactor < 0)
            {
                rotateLeft(ref tree.Left);
            }
            newRoot = tree.Left;
            tree.Left = newRoot.Right;
            newRoot.Right = tree;
            tree = newRoot;

        }


        private void rotateLeft(ref Node<T> tree)
        {
            if (tree.Right.BalanceFactor > 0)
            {
                rotateRight(ref tree.Right);
            }

            newRoot = tree.Right;
            tree.Right = newRoot.Left;
            newRoot.Left = tree;
            tree = newRoot;

        }

        public IEnumerator<Country> GetEnumerator()
        {
            // Some iterator/loop which uses "yield return" for each item

        }


        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
类AVLTree:BSTree,IEnumerable其中T:IComparable
{
节点新根;
公共新作废插入项(T项)
{
插入项(项,参考根);
}
私有void插入项(T项,引用节点树)
{
if(tree==null)
{
树=新节点(项目);
}
else if(项比较到(树数据)<0)
{
插入项(项目,左参考树);
}
else if(项比较(树数据)>0)
{
插入项(项目,参考树右侧);
}
tree.BalanceFactor=高度(参考树左侧)-高度(参考树右侧);
如果(tree.BalanceFactor=2)
{
旋转光(参考树);
}
}
专用空心旋转灯光(参照节点树)
{
if(tree.Left.BalanceFactor<0)
{
rotateLeft(参考树左侧);
}
newRoot=tree.Left;
tree.Left=newRoot.Right;
newRoot.Right=树;
树=新根;
}
私有void rotateLeft(参考节点树)
{
如果(tree.Right.BalanceFactor>0)
{
旋转右(参考树右);
}
newRoot=tree.Right;
tree.Right=newRoot.Left;
newRoot.Left=树;
树=新根;
}
公共IEnumerator GetEnumerator()
{
//一些迭代器/循环,对每个项使用“yield return”
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}

您需要实际实现一个枚举器。现在,您的实现通过调用自身无限循环—不返回任何枚举器

public IEnumerator<Country> GetEnumerator()
{
    // Some iterator/loop which uses "yield return" for each item
    foreach (var item in items)
        yield return item;
}

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}
public IEnumerator GetEnumerator()
{
//一些迭代器/循环,对每个项使用“yield return”
foreach(项目中的var项目)
收益回报项目;
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}

设置断点,逐步完成代码?您的方法正在调用自己。为什么要实现
IEnumerable
?什么是
BSTree
?@CodeCaster这是另一个类,我有一个BSTree、BinaryTree和AVLTree,还有一个节点类,它有左、右、T数据和平衡因子getter/setter。您的GetEnumerator keeps调用自身。这当然会导致堆栈溢出。调试器会立即显示此问题。@SamiKuhmonen如何消除此循环?
GetEnumerator
只调用自身,导致异常。如果您在基类中实现了它,您应该可以删除此版本。您好,谢谢或者你的答案。我的错误变得越来越明显。只有一个问题不是应该是
foreach
,而是
var项目
?难道不是
国家项目
?我从来没有用过这个。我还在(?)。在我的AVLTree类中,我只有一个
节点
旋转项
旋转项
插入项
。是的。
国家项目
变量项目
意味着同样的事情。你可以编写任何形式的for/foreach/while循环。重要的部分是
产生返回
每个项目。我是绝对正确的我不努力理解(…)中的
。我应该放什么?
foreach(国家/地区项目…)
。你能发布一些关于你通常如何走树的代码吗?然后我可以根据你的使用情况调整答案。因此,你想如何走树的逻辑并不清楚。这不是一个简单的线性流程。你希望列出所有分支上的每个项目吗?你希望走一个分支吗?你是从树干走到树叶还是从树叶f到trunk?您可能需要设计迭代流,然后编写代码就很容易了。
   class AVLTree<T> : BSTree<T>, IEnumerable<Country> where T : IComparable
    {

        Node<T> newRoot;



        public new void InsertItem(T item)
        {
            insertItem(item, ref root);
        }



        private void insertItem(T item, ref Node<T> tree)
        {
            if (tree == null)
            {
                tree = new Node<T>(item);
            }

            else if (item.CompareTo(tree.Data) < 0)
            {
                insertItem(item, ref tree.Left);
            }
            else if (item.CompareTo(tree.Data) > 0)
            {
                insertItem(item, ref tree.Right);
            }

            tree.BalanceFactor = Height(ref tree.Left) - Height(ref tree.Right);

            if (tree.BalanceFactor <= -2)
            {
                rotateLeft(ref tree);
            }
            if (tree.BalanceFactor >= 2)
            {
                rotateRight(ref tree);
            }
        }




        private void rotateRight(ref Node<T> tree)
        {
            if (tree.Left.BalanceFactor < 0)
            {
                rotateLeft(ref tree.Left);
            }
            newRoot = tree.Left;
            tree.Left = newRoot.Right;
            newRoot.Right = tree;
            tree = newRoot;

        }


        private void rotateLeft(ref Node<T> tree)
        {
            if (tree.Right.BalanceFactor > 0)
            {
                rotateRight(ref tree.Right);
            }

            newRoot = tree.Right;
            tree.Right = newRoot.Left;
            newRoot.Left = tree;
            tree = newRoot;

        }

        public IEnumerator<Country> GetEnumerator()
        {
            // Some iterator/loop which uses "yield return" for each item

        }


        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
public IEnumerator<Country> GetEnumerator()
{
    // Some iterator/loop which uses "yield return" for each item
    foreach (var item in items)
        yield return item;
}

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}