获取布尔数组(c#)中超出范围的异常

获取布尔数组(c#)中超出范围的异常,c#,C#,我尝试使用随机数从58个字符串的数组中提取30个字符串,我使用布尔数组检查并确保同一个数字不会被调用两次。方法和程序总是因索引超出范围错误而崩溃。这里是方法 static string[] newlist(string[] s) { string[] newlist = {}; bool[] issearched = new bool[s.Length]; Random callorder =

我尝试使用随机数从58个字符串的数组中提取30个字符串,我使用布尔数组检查并确保同一个数字不会被调用两次。方法和程序总是因索引超出范围错误而崩溃。这里是方法

        static string[] newlist(string[] s)
        {
            string[] newlist = {};
            bool[] issearched = new bool[s.Length];
            Random callorder = new Random();
            for (int i = 0; i < 31; i++)
            {
               int number = callorder.Next(0, s.Length);
               if (issearched[number] == false)
               {
                   newlist[number] = s[number];
                   issearched[number] = true;//this is where it always crashes even though the ide says issearced has 58 elements and the random number is always smaller than that.
               }
               else
                   i--;
            }
            return newlist;              
        }
静态字符串[]新列表(字符串[]s)
{
字符串[]newlist={};
bool[]issearched=新bool[s.长度];
随机调用顺序=新随机();
对于(int i=0;i<31;i++)
{
int number=callorder.Next(0,s.Length);
如果(issearched[数字]==假)
{
newlist[number]=s[number];
issearched[number]=true;//这就是它总是崩溃的地方,即使ide说issearched有58个元素,并且随机数总是小于此值。
}
其他的
我--;
}
返回newlist;
}

我确信这很简单,但我不明白为什么索引8超出了数组58的范围。

我相信你在这里真的崩溃了:

newlist[number] = s[number];
替换

string[] newlist = {};

您的新列表大小为0个元素,没有为其分配足够的空间

此外,如果输入大小小于31个元素,您的程序将进入无限循环。

您的数组新列表(多么令人困惑的名称)没有空间存储任何内容。
这条线

  string[] newlist = {};
声明数组,但不设置存储任何元素的空间,因此当您尝试在数组上使用索引器时,会出现异常

我建议使用不同的方法从传递的数组中查找30个字符串。
使用
列表
并继续添加到此列表,直到列表中有30个元素

    static string[] newlist(string[] s)
    {
        List<string> selectedElements = new List<string>();
        bool[] issearched = new bool[s.Length];
        Random callorder = new Random();
        while(selectedElements.Count  < 30))
        {
           int number = callorder.Next(0, s.Length);
           if (!issearched[number])
           {
               selectedElements.Add(s[number]);
               issearched[number] = true;
           }
        }
        return selectedElements.ToArray();
    }
静态字符串[]新列表(字符串[]s)
{
List selectedElements=新建列表();
bool[]issearched=新bool[s.长度];
随机调用顺序=新随机();
while(selectedElements.Count<30))
{
int number=callorder.Next(0,s.Length);
如果(!issearched[编号])
{
选择元素。添加(s[编号]);
issearched[数字]=真;
}
}
返回selectedElements.ToArray();
}
如果您喜欢使用方法中的数组,那么需要对代码进行一些修复

static string[] newlist(string[] s)
{
    string[] newlist = new string[30];
    bool[] issearched = new bool[s.Length];
    Random callorder = new Random();
    for (int i = 0; i < 30; i++)
    {
       int number = callorder.Next(0, s.Length);
       if (issearched[number] == false)
       {
           newlist[i] = s[number];
           issearched[number] = true;
       }
       else
           i--;
    }
    return newlist;
}
静态字符串[]新列表(字符串[]s)
{
string[]newlist=新字符串[30];
bool[]issearched=新bool[s.长度];
随机调用顺序=新随机();
对于(int i=0;i<30;i++)
{
int number=callorder.Next(0,s.Length);
如果(issearched[数字]==假)
{
newlist[i]=s[number];
issearched[数字]=真;
}
其他的
我--;
}
返回newlist;
}
  • 声明newlist数组有空间存储30个元素
  • for循环30次(而不是当前代码中的31次)
  • 新列表应使用变量
    i

否您的数组newlist的长度不是58个元素。它的长度是[s.length]的58个元素。当我在断点处滚动时,visual studio显示58。再次检查这是issearched的长度而不是newlist的长度,您正在分配给newlist而不是issearched,例外情况是在newlist AssignementHanks中。我对编程还是新手,而且还不太擅长调试,所以我一定是没有理解ide所说的问题是什么。谢谢你解决了这个问题。我想我没有读到ide所说的问题是正确的,但它现在正在运行。我打赌我看起来很傻哈哈^-^;
static string[] newlist(string[] s)
{
    string[] newlist = new string[30];
    bool[] issearched = new bool[s.Length];
    Random callorder = new Random();
    for (int i = 0; i < 30; i++)
    {
       int number = callorder.Next(0, s.Length);
       if (issearched[number] == false)
       {
           newlist[i] = s[number];
           issearched[number] = true;
       }
       else
           i--;
    }
    return newlist;
}