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