C# - IEnumerable<> StackOverFlowException(AVLTree)

时间:2017-02-15 21:26:30

标签: c# ienumerable avl-tree

我在使用IEnumerable<>

时遇到问题

我正在阅读CSV文件,我对我的get / set方法进行了排序,并且在实施IEnumerable<>之前测试了我的代码,并正确显示了Autos / Locals。

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

foreach (Country country in avlTree)
                    {

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

                    }

使用AVLTree和我编写的InsertItem方法将此数据附加到AVLTree

  avlTree.InsertItem(tempCountry);

使用时会出现此问题:

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

我已经实现了接口:

 public IEnumerator<Country> GetEnumerator()
        {

            return this.GetEnumerator();

            throw new NotImplementedException();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {

            return GetEnumerator();
            throw new NotImplementedException();
        }


    }

但是,没有运气。

在本地人中,我得到了这个输出 -

$exception {"Exception of type "System.StackOverflowException' was thrown"}

我得到一个红叉,名称this的值为Unable to read memory

Type Variables T的值为System.__Canon

我在我的国家/地区课程中实施了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();
        }

1 个答案:

答案 0 :(得分:0)

您需要实际实现一个枚举器。现在你的实现通过调用自身无限循环 - 没有返回枚举器。

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();
}