【问题标题】:Why does this code produce an 'Index was out of range' exception? [closed]为什么此代码会产生“索引超出范围”异常? [关闭]
【发布时间】:2015-12-04 15:01:42
【问题描述】:

我知道这一定是一个重复的问题,但我不得不问,因为我不明白为什么我的代码不起作用。我收到此错误:

索引超出范围。必须是非负数且小于集合的大小

这是我的代码中引发异常的部分:

private static void getPattern(ArrayList arrayList1)
    {
        ArrayList array_2008 = new ArrayList();
        ArrayList array_2009 = new ArrayList();
        ArrayList array_2010 = new ArrayList();
        ArrayList array_2011 = new ArrayList();
        ArrayList array_2012 = new ArrayList();

        for (int i = 0; i < arrayList1.Count; i++)
        {
            if (arrayList1[i].ToString().Contains("2008"))
            {
                int a = getIndex(arrayList1[i].ToString());
                array_2008[a] = arrayList1[i];
            }
            if (arrayList1[i].ToString().Contains("2009"))
            {
                int a = getIndex(arrayList1[i].ToString());
                array_2009[a] = arrayList1[i]; 
            }
            else if (arrayList1[i].ToString().Contains("2010"))
            {
                int a = getIndex(arrayList1[i].ToString());
                array_2010[a] = arrayList1[i];
            }
            else if (arrayList1[i].ToString().Contains("2011"))
            {
                int a = getIndex(arrayList1[i].ToString());
                array_2011[a] = arrayList1[i];
            }
            else if (arrayList1[i].ToString().Contains("2012"))
            {
                int a = getIndex(arrayList1[i].ToString());
                array_2012[a] = arrayList1[i];
            }
        }

请给我一个答案。我不知道我该怎么做。它抛出了上面提到的异常。问题是它在arraylist1[0] 位置抛出。这是为什么?如何解决?

这里的值:

"4/28/2008","4/29/2008",5/10/2008 同样是 33 个值

【问题讨论】:

  • 快到 2016 年了。停止使用ArrayList。请改用List&lt;T&gt;
  • 您的 ArrayLists(array_2008array_2009array_2010array_2011array_2012)为空,因此您无法访问索引。你需要添加一些东西。
  • @MaximilianGerhardt 显然问题不在于arraylist1,因为for 循环使用的是arraylist1.Count
  • OP 是一个初学者,也许引导他们解决他们的问题而不是责备他们没有完全按照你的方式做事会更有帮助。

标签: c# .net arraylist


【解决方案1】:
var array_2008 = new List<object>() {0, string.Empty};
var array_2009 = new List<object>() {0, string.Empty};
var array_2010 = new List<object>() {0, string.Empty};
var array_2011 = new List<object>() {0, string.Empty};
var array_2012 = new List<object>() {0, string.Empty};

for (int i = 0; i < arrayList1.Count; i++)
{
    var aIndex = getIndex(arrayList1[i].ToString());
    if (arrayList1[i].ToString().Contains("2008"))
    {
        //array_2008[0] = aIndex;
        //array_2008[1] = arrayList1[i]; uncomment this if you wanat to add List<T> other wise comment out bottom code 
        //and uncomment code above
        array_2008.Add( new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    if (arrayList1[i].ToString().Contains("2009"))
    {
        array_2009.Add( new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    else if (arrayList1[i].ToString().Contains("2010"))
    {
        array_2010.Add(new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    else if (arrayList1[i].ToString().Contains("2011"))
    {
        array_2011.Add(new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
    else if (arrayList1[i].ToString().Contains("2012"))
    {
        array_2012.Add(new List<object>()
        {
            aIndex, arrayList1[i].ToString() 
        });
    }
}

【讨论】:

  • @Mlarnt90 我建议将ArrayList 切换到List&lt;T&gt;,这很容易实现,例如var array_2008 = new List&lt;object&gt;,因为我不知道您是否正在加载字符串,或者如果他们加载日期是字符串,然后将 List 更改为 List&lt;string&gt;
  • 你也不需要这条线int a = getIndex(arrayList1[i].ToString());,如果它包含你正在寻找的基于arrayList1中的位置的值,那么你已经知道你所在的索引位置基于@ 987654327@ 在循环中
  • 非常感谢先生。我得到了我想要的答案。非常感谢您的努力。
  • 感谢大家的努力...真的帮助了我...
  • @Mlarnt90 没问题 在您向我展示了您希望 List 值看起来像我知道您可以使用List&lt;object&gt;欢呼
【解决方案2】:

您将需要改变处理此问题的方式。您当前正在尝试获取参数数组中值的索引并在目标数组中使用它。当然,这不适用于空的 ArrayList!

您需要做的是使用现代 C# 重新开始:

public static void GetPattern(List<string> values)
{
    var years = new Dictionary<string, List<string>>();

    foreach(var value in values)
    {
        if(value.Contains("2008")) 
        {
            if(!years.ContainsKey("2008")) years.Add("2008", new List<string>());
            years["2008"].Add(value);
        }

        if(value.Contains("2009")) 
        {
            if(!years.ContainsKey("2009")) years.Add("2009", new List<string>());
            years["2009"].Add(value);
        }

        // Add for each year you want to track.
    }

    // Do something with your pattern.
 }

【讨论】:

    【解决方案3】:

    您可以通过依赖List&lt;T&gt; 类并将FindAll() 与谓词一起使用来进一步简化方法方法。

    private static void getPattern(List<string> inputData)
        {
          List<string> array_2011 = inputData.FindAll(data => data.Contains("2011"));
          //...
        }
    

    您可以将List&lt;T&gt; 的通用参数更改为ArrayList 中的任何内容,但是在C# 中使用Linq 而不是使用ArrayList 要容易得多(好像你已经从Java 中得到了) ?)。您甚至可以扩展它以与任何IEnumerable 集合兼容。对于一般object案例:

    private static void getPattern(List<object> inputData)
        {
          List<object> array_2011 = inputData.FindAll(data => data.ToString().Contains("2011"));
          //...
        }
    

    这将避免迭代大小为 0 的集合。

    【讨论】:

    • 您假设ArrayList 包含string。据我们所知,它可能是DateTime,OP 正在检查年份。
    • @MaximilianGerhardt 当 OP 在评论中询问如何使用 List&lt;T&gt; 时,我怀疑 OP 关于 Predicates 的已知信息
    • 糟糕,正确,他只是在 arrayList1 内的东西上调用 .ToString()。再说一次,你可以使用List&lt;object&gt;,也可以使用.ToString(),我只是想告诉他这些for循环对于小型Linq查询和更好的数据类是不必要的。
    【解决方案4】:

    这是因为您试图在位置 a 的数组列表(2008 年到 2012 年的列表)中添加一个值,但它们是空的,所以 a 超出了范围。 您需要使用数组列表的添加功能或使用已设置为特定大小的数组(可能与arrayList1 的大小相同)。希望这会有所帮助

    【讨论】:

    • 不,不是......这是因为要为 ArrayList 分配/添加值,您需要使用.Add Method 在下面查看我的工作答案
    • 我建议使用arraylist的add方法。或者如果位置需要匹配arraylist1,则使用数组(具有设定的大小)。
    【解决方案5】:

    由于您的 ArrayList 为空,因此不存在索引。首先添加一些虚拟数据以创建索引,然后添加实际值。 我希望这能解决你的问题,我已经测试过它正在工作

            private static void getPattern(ArrayList arrayList1)
        {
            ArrayList array_2008 = new ArrayList();
            ArrayList array_2009 = new ArrayList();
            ArrayList array_2010 = new ArrayList();
            ArrayList array_2011 = new ArrayList();
            ArrayList array_2012 = new ArrayList();
    
            for (int i = 0; i < arrayList1.Count; i++)
            {
                if (arrayList1[i].ToString().Contains("2008"))
                {
                    int a = getIndex(arrayList1[i].ToString());
                    for (int j = 0; j < a + 1; j++)
                    {
                        array_2008.Add("empty");
                    }
                    array_2008[a] = arrayList1[i];
                }
                if (arrayList1[i].ToString().Contains("2009"))
                {
                    int a = getIndex(arrayList1[i].ToString());
                    for (int j = 0; j < a + 1; j++)
                    {
                        array_2009.Add("empty");
                    }
                    array_2009[a] = arrayList1[i];
                }
                else if (arrayList1[i].ToString().Contains("2010"))
                {
                    int a = getIndex(arrayList1[i].ToString());
                    for (int j = 0; j < a + 1; j++)
                    {
                        array_2010.Add("empty");
                    }
                    array_2010[a] = arrayList1[i];
                }
                else if (arrayList1[i].ToString().Contains("2011"))
                {
                    int a = getIndex(arrayList1[i].ToString());
                    for (int j = 0; j < a + 1; j++)
                    {
                        array_2011.Add("empty");
                    }
                    array_2011[a] = arrayList1[i];
                }
                else if (arrayList1[i].ToString().Contains("2012"))
                {
                    int a = getIndex(arrayList1[i].ToString());
                    for (int j = 0; j < a + 1; j++)
                    {
                        array_2012.Add("empty");
                    }
                    array_2012[a] = arrayList1[i];
                }
            }
    

    【讨论】:

    • 投反对票你能给出什么理由?
    • ArrayList uses a .Add` 方法来添加值.. 这不是Array 它是ArrayList 集合..
    • 是的,他正在使用 ArrayList。我在哪里使用 .Add on Array?此外,在发布之前,我自己运行代码没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2013-10-19
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2010-12-22
    • 2015-09-10
    相关资源
    最近更新 更多