解决递归和无限循环问题

时间:2015-03-03 20:18:20

标签: c# recursion infinite-loop

我目前正在编写一个从文本文件中读取数据的程序。我目前遇到的问题是下面的CompareTo方法会出现错误System.StackOverflowException was unhandled并说"确保您没有无限循环或无限递归。此错误显示在return name.CompareTo(temp.name);行上。

全班如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Country
{
    public class Country : IComparable
    {
        // Country Properties

        private String name;
        private float gdpGrowth;
        private float inflation;
        private float tradeBalance;
        private float hdiRanking;
        private LinkedList<String> tradePartners;

        //Constructor

        public Country(String name, float gdpGrowth, float inflation, float tradeBalance, float hdiRanking, LinkedList<String> tradePartners)
        {
            this.name = name;
            this.gdpGrowth = gdpGrowth;
            this.inflation = inflation;
            this.tradeBalance = tradeBalance;
            this.hdiRanking = hdiRanking;
            this.tradePartners = tradePartners;
        }

        public String Name
        {
            set { this.name = value; }
            get { return name; }
        }

        public float GdpGrowth
        {
            set { this.gdpGrowth = value; }
            get { return gdpGrowth; }
        }

        public float Inflation
        {
            set { this.inflation = value; }
            get { return inflation; }
        }

        public float TradeBalance
        {
            set { this.tradeBalance = value; }
            get { return tradeBalance; }
        }

        public float HdiRankings
        {
            set { this.hdiRanking = value; }
            get { return hdiRanking; }
        }

        public LinkedList<String> TradePartners
        {
            set { this.tradePartners = value; }
            get { return tradePartners; }
        }

        public override string ToString()
        {
            return name + ", " + gdpGrowth + ", " + inflation + ", " + tradeBalance + ", " + hdiRanking + ", " + tradePartners;
        }

        public int CompareTo(object other)
        {                
            Country temp = (Country)other;
            return name.CompareTo(temp.name);
        }    
    }
}

正在调用国家/地区类的班级是......

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Country
{
    public partial class Form1 : Form
    {
        private AVLTree<Country> countryTree = new AVLTree<Country>();




        public Form1()
        {
            InitializeComponent();
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            // array to stroe each line of the file
            String[] Lines = new string[1000];
            String[] tempPartners = new string[1000];

            int count = 0;

            // Store each line of the file in the eachLine array

            Lines = File.ReadAllLines("countries.csv");

            foreach (String line in Lines)
            {
                if (count == 0)
                {
                    count++;
                }
                else
                {
                    // array to hold info
                    String[] info = new string[5];
                    //splits the countries
                    info = line.Split(',');
                    // split trade partners and puts in array
                    tempPartners = info[5].Split(';', '[', ']');
                    // insert current instance of country into AVL Tree
                    countryTree.InsertItem(new Country(info[0], float.Parse(info[1]), 
                    float.Parse(info[2]), float.Parse(info[3]), float.Parse(info[4]), new LinkedList<String>(tempPartners)));


                    // create seperator 
                    string seperator = ", ";
                    // stroe array
                    string partners = string.Join(seperator, tempPartners);
                    // remove first comma
                    partners = partners.Substring(1, partners.Length - 1);
                    //remove last comma
                    partners = partners.Remove(partners.Length - 2);
                    //pass in information from file into grid view
                    dataGridView1.Rows.Add(info[0], info[1], info[2], info[3], info[4], partners);

                }
            }
        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

1 个答案:

答案 0 :(得分:1)

你在这里得到了无限的递归。 CompareTo进行递归调用但由于缺少基本情况而不会终止,因此递归堆栈会无限增长。也没有实际的比较。您想要返回什么整数值,以及在什么条件下返回?

也许正如Cyber​​Dude所说,你真的在​​尝试使用String.Compare(name, temp.name)吗?

相关问题