2017-02-15 7 views
0

У меня возникли проблемы с использованием IEnumerable<>C# - IEnumerable <> StackOverflowException (AVLTree)

Я читала в файл CSV, я мои методы получения/установки сортируются и я проверил мой код до реализации IEnumerable<> и Авто/Местные жители отображаются правильно.

Я пытаюсь отобразить содержимое CSV-файла в DataGridView

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 

Я реализовал i nterfaces:

public IEnumerator<Country> GetEnumerator() 
     { 

      return this.GetEnumerator(); 

      throw new NotImplementedException(); 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 

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


    } 

Однако, не повезло, что-то никогда.

В местных жителях, я получаю это output-

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

Я получаю красный крест и имя this со значением Unable to read memory

И Type Variables T имеет значение System.__Canon

Я реализовал IEnumerable<> в моем классе по стране и никаких проблем.

Я просто не могу понять, что вызывает эту проблему.

Может кто-нибудь, пожалуйста, предложит некоторые рекомендации или пролить свет на этот вопрос.

Спасибо.

EDIT - реализация моей 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(); 
     } 
+0

Установите контрольную точку, перейдите по коду? Ваши методы называют себя. Почему вы реализуете 'IEnumerable '? Что такое 'BSTree '? – CodeCaster

+0

@CodeCaster Это еще один класс, у меня есть BSTree, BinaryTree и AVLTree, а также класс Node, у которого есть получатели/сеттеры Left, Right, T Data и BalanceFactor. – ImTheOneWhoCodes

+0

Ваш GetEnumerator продолжает называть себя. Это, конечно, вызовет переполнение стека. Отладчик немедленно обнаружит эту проблему. –

ответ

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

Здравствуйте, спасибо за ваш ответ. Моя ошибка становится все более очевидной.Только один вопрос. Разве это не значит быть «foreach» и вместо «var item» не может быть «Country item»? Я никогда не использовал это. Также я борюсь с 'in (?)'. Все, что у меня есть, - это «Узел », 'rotateLeft',' rotateRight' и 'insertItem'. В моем классе AVLTree. – ImTheOneWhoCodes

+0

Да. «Элемент страны» и «var item» означают одно и то же. Вы можете написать любой тип/foreach/while loop, который вам нравится. Важная часть состоит в том, чтобы «возвращать» каждый элемент. https://www.dotnetperls.com/yield –

+0

Я просто пытаюсь понять 'in (...)'. Что мне делать? 'foreach (элемент страны в ...)'. – ImTheOneWhoCodes

Смежные вопросы