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