带有“无限”数组的IndexOutOfRangeException?

时间:2017-03-14 21:11:16

标签: c# arrays discord.net

首先,我只想花一点时间向所有读者保证我不会'精通'C#,因此答案可能很明显(虽然我在搜索时找不到一个)。

我目前有一个EnumerableUtility自定义类,用于将数据类型(通常是Enumerables,有时是其他数据类型)转换为object[]数组。我正在使用一种非常草率的方法,基本上是这样的:

class EnumerableUtility
{
    private IReadOnlyCollection<object> data;
    public EnumerableUtility(IReadOnlyCollection<object> x)
    {
        data = x;
    }
    public object[] ConvertToArray()
    {
        object[] info = { };
        // Here's where I think the exception is raised
        foreach (object obj in data)
            info[info.Length] = obj;
        return info;
    }
}

再次,对于可怕的代码,草率的方法和轻微的无知感到抱歉,但我有点想把它排成一个适当的'数组'以便于管理。有没有办法做到这一点?感谢。

2 个答案:

答案 0 :(得分:1)

您的数组object[] info = { }; 有绑定绑定到ZERO(1个元素)。您需要做的是创建一个传入数据长度的数组,例如。

object[] info = new object[data.Count];

接下来,您的数组转换不正确您将索引设置为数组的Length。这将始终超出范围,因为数组基于零索引(即第一个数组项位于索引0而不是1)。

最后,如果您要为索引更改为info.Length-1,则意味着您只会在每个循环上设置 LAST 元素。哪种类型的否定循环,因为您可以简单地将数组中的最后一个元素分配给集合中的最后一个元素。我已经重写了将ReadOnly集合转换为数组的方法。

public object[] ConvertToArray()
{
    object[] info = new object[data.Count];
    var i = 0;
    // Here's where I think the exception is raised
    foreach (var obj in data)
        info[i++] = obj;
    return info;
}

现在,这将从您的集合中返回一个对象数组。然而,这完全没有用,因为它重新发明一个非常大的轮子。

我们已经在每个 IEnumerable上使用了一种扩展方法,将其转换为类型化数组。

var c = (object[])data.ToArray();

将您的集合转换为数组的一行(无需额外方法)。

  1. Enumerable.ToArray()
  2. List<T>.ToArray()
  3. ArrayList.ToArray()

答案 1 :(得分:0)

您无法为索引为info.Length的元素指定值。 你应该这样做:

object[] info = new object[data.Length];
int i = 0;
foreach (object obj in data)
   info[i++] = obj;