在制作直方图时如何修复列表索引超出范围异常?

时间:2014-10-07 12:29:51

标签: c# list

无论出于何种原因,当我运行我的程序时,我的指数超出范围'我的整数列表的错误,尽管事实上我使用了与此函数类似的代码,但它工作正常。我不确定我错过了什么,有人可以帮忙吗?

以下是代码:

public void Histogram() //Function that creates a histogram 
{
    List<int> histo = new List<int>();
    int histogram;

    int a = 1;
    int z = 5;

    //userNumber is a list containing a set of integers
    for ( int x = 0; x < userNumber.Count; x++) 
    {
        histogram = userNumber[x];

        if (histogram >= a && histogram <= z)
        {
            histo[x] += 1; //This is where the error occurs
        }
        else
        {
            a += 5;
            z += 5;
            histo.Add(1);
        }                                
    }

    a = 1;
    z = 5;

    for( int h = 0; h < histo.Count; h++)
    {
        histogram = h;

        Console.Write("{0} - {1}  ", a, z);

        for (int x = 0; x < histogram; x++)
        {
            Console.Write("*");
        }

        a += 5;
        z += 5;

        Console.WriteLine("\n");
    }

}

4 个答案:

答案 0 :(得分:4)

这一行可能抛出异常:

histo[x] += 1;

您的列表hist中没有任何整数,或者您尝试访问的索引高于列表中的项目。因此抛出异常....

答案 1 :(得分:2)

问题是您尚未正确初始化histo以用于索引:它具有零元素,因此您无法使用x对其进行索引。

立即用一个元素初始化你的列表,像这样,

List<int> histo = new List<int> { 0 };

并替换

histo[x] += 1

histo[histogram / 5] += 1

解决此问题。

我添加了除以5的除法,因为每次遇到不符合直方图的数字时,你的边界似乎都会增加5。

您还应该从构建直方图的代码中删除z += 5;:您应该扩展范围,而不是将其向上移动5。

更好的方法是预先调整histo的大小,并在第一个循环中跳过修改az

List<int> histo = new List<int>(Enumerable.Range(0, userNumber.Max() / 5));
foreach (var h in userNumber) {
    histo[h/5]++;
}
// Print your histogram in the usual way

答案 2 :(得分:1)

错误的原因是您尝试从空列表中读取

  // histo doesn't have any items at all: histo.Count == 0 
  List<int> histo = new List<int>();

  ...

  // You're trying to read a non existing item (histo doesn't have any items)
  histo[x] += 1;

可能的修改:

  // histo has userNumber.Count items which are equal to 0
  List<int> histo = new int[userNumber.Count].ToList();

答案 3 :(得分:0)

假设第一个userNumber属于此代码:

if (histogram >= a && histogram <= z)
{
    histo[x] += 1; //This is where the error occurs
}

你从未在histo中添加一个数字,因此它会使Index超出范围,因为histo为空。

为避免这种情况,在使用此类访问者之前,您必须确保Add