我是编程的新手,我决定通过创建基于用户输入的随机字生成器来给自己一个挑战。 我试图将用户的单词放在数组中,然后从数组中显示一个随机单词。当我运行程序时,我能够输入最多四个单词,然后我收到一个错误:"数组索引超出范围。"
我可以调整阵列大小的次数有限制吗?
using System;
namespace RandomWordGenerator
{
class MainClass
{
public static void Main (string[] args)
{
Random r = new Random ();
string[] words = new string[1];
Console.WriteLine ("Enter words for the random word generator. ");
int a = 0;
while(!(Console.ReadLine().Equals("END"))){
words[a] = Console.ReadLine();
a++;
Array.Resize(ref words, a);
}
Console.WriteLine ();
Console.WriteLine (words[r.Next (a)]);
}
}
}
答案 0 :(得分:3)
c#中的数组是不可变的,也就是说创建它们后无法更改。
你想要的是List<string>
,可以随意调整大小。
class MainClass
{
public static void Main (string[] args)
{
Random r = new Random ();
List<string> words = new List<string>();
Console.WriteLine ("Enter words for the random word generator. ");
int a = 0;
while(!(Console.ReadLine().Equals("END"))){
words.Add(Console.ReadLine());
}
Console.WriteLine ();
Console.WriteLine (words[r.Next(words.Count)]);
}
}
Array.Resize
实际上并没有很好地命名,因为它与实际调整大小有所不同。来自MSDN文档:
此方法分配具有指定大小的新数组,将旧数组中的元素复制到新数组,然后用新数组替换旧数组。
List<>
类是为动态大小的集合而设计的,在许多情况下是比原始数组更好的选择。
答案 1 :(得分:1)
您看到IndexOutOfRangeException
的原因是因为您正在尝试访问索引超出其当前范围的数组:
int a = 0;
while(!(Console.ReadLine().Equals("END")))
{
words[a] = Console.ReadLine();
a++;
Array.Resize(ref words, a);
}
在第一次迭代后,您尝试访问words[a]
a = 1
,但数组索引基于零,因此您尝试访问{{ 1}}其中数组只有1个元素位于words[1]
索引处,因为您使用words[0]
分配了一个新数组,并将Array.Resize
作为其大小。这就是你看到异常的原因。
您的解决方案存在问题,如@rossipedia所述。只需使用a (1)
。
答案 2 :(得分:0)
关于使用List
的建议都是好的和有效的,但是直接回答了您的具体问题 -
Array.Resize(ref words, a);
应更改为 -
Array.Resize(ref words, a + 1);
原因 - 您从a=0;
开始,将words[0]
设置为值读取,设置a=1
,然后要求运行时将数组从大小1调整为1 ..休息随之而来。