У меня возникли проблемы с использованием 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();
}
Установите контрольную точку, перейдите по коду? Ваши методы называют себя. Почему вы реализуете 'IEnumerable'? Что такое 'BSTree '? –
CodeCaster
@CodeCaster Это еще один класс, у меня есть BSTree, BinaryTree и AVLTree, а также класс Node, у которого есть получатели/сеттеры Left, Right, T Data и BalanceFactor. – ImTheOneWhoCodes
Ваш GetEnumerator продолжает называть себя. Это, конечно, вызовет переполнение стека. Отладчик немедленно обнаружит эту проблему. –