我想通过创建一个小程序来实践制作数组,该程序允许用户输入数组所具有的元素,然后创建一个包含用户输入的元素数量的数组,并用数字填充所有元素。例如:如果输入3,它将生成3个元素,填充元素1的编号为1,编号2编号为2,依此类推。虽然每次都会出现特定错误:CS0021无法将[]索引应用于“方法组”类型的表达式这是我的代码:
static void Main(string[] args)
{
int num;
string getNum;
getNum = Console.ReadLine();
num = Int32.Parse(getNum);
int[] array = new int[num];
Console.WriteLine("Array created with {0} elements.",num);
}
static void Array(int input)
{
int num = 1;
int inum = input;
while(inum >= input)
{
Array[inum] = num;
Console.WriteLine("{0}",input);
Console.WriteLine("{0}", num);
inum = inum - 1;
num = num + 1;
}
如果您决定帮助我,请提前致谢:)
在你的程序中,qazxsw poi是一种方法。
因此,Array
行是错误的,因为Array[inum] = num
是一种方法,并且您不能将索引器(Array
)应用于方法。
实现您想要的最快捷方式如下:
[]
在你的主要方法中:
static int[] Array(int input) // Change return type to return an array of integers
{
var result = new int[input]; // Declare a local variable to hold a new array of size input.
// Change while to basic for loop
for (int i = 0; i < input; i++)
{
result[inum] = i + 1; // set elements of the result array.
Console.WriteLine("{0}",input);
Console.WriteLine("{0}", i);
}
}
或者你可以使用一个简单的Linq语句:
static void Main(string[] args)
{
int num;
string getNum;
getNum = Console.ReadLine();
num = Int32.Parse(getNum);
int[] array = Array(num); // Change this to call the Arrra(int num) method
Console.WriteLine("Array created with {0} elements.",num);
}
好吧,让我们稍微整理你的代码,并尝试让它做你想做的事情:
让我们首先从你的Enumerable.Range(1, input).ToArray();
方法中获取任何逻辑,并编写特定的方法,向你的目标迈出一小步。记住,你制作方法越小,就越难找到写错误的方法。如果你正在学习,那就开始变得荒谬,并且随着你获得自信而变大。
好吧,有一个概念就是要求用户输入一个数字,让我们编写一个方法来执行此操作,并使其在此过程中尽可能健壮。请记住,用户是愚蠢的!问一个号码,他们会输入任何东西,但是:
Main
好的,所以这个方法的作用是询问用户一个正整数,并且它将一直这样做,直到用户设法输入一个有效的数字或拉动插头。无论哪种方式,我们都很安全。 public static int PromptUserForPositiveInteger(string prompt)
{
int number;
Console.Write(prompt);
var input = Console.ReadLine();
while (!int.TryParse(input, out number) ||
number < 0)
{
Console.Write("Input is not a valid number, try again: ");
input = Console.ReadLine();
}
return number;
}
是一种从int.TryParse
中提取int
的安全方式;如果它可以这样做,它会给你一个数字并返回string
,否则它将返回true
。如果它失败了,它不会做的就是在你的脸上爆炸,这是false
很乐意做的事情。避免像瘟疫一样的int.Parse
,总是使用frendlier Parse
。
另外值得一提的是,这个方法是一个实现细节,所以它的TryParse
。班上没有人需要使用它,所以不要显示它。
另请注意,我们可以对此进行概括,使调用者指定您要如何提示用户。你没有理由想要将这种方法仅限于数组大小,也许明天你需要你要喂猴子的香蕉数量!每当它便宜又容易,概括你的代码。每当概括很难,不要,你可能不会需要它并且浪费精力。
现在,我们需要的下一个任务是制作一个private
数组并用值填充它。该值将是每个数组元素的索引。哦,等等,我们说无论多么荒谬,我们都会为每个任务制定一个方法!是的,我知道,但荒谬的小只是到目前为止。
int
private static int[] CreatArrayAndSetValuesToIndex(int size)
{
Debug.Assert(size >= 0);
var array = new int[size];
for (var i = 0; i < size; i++)
{
array[i] = i;
}
return array;
}
似乎是一个荒谬的长名,但它确切地告诉你该方法的作用。习惯使用描述性名称并避免使用缩写。现在使用intellisense,使用简短的神秘名称毫无意义。
还要注意参数验证。我永远不会强调这一点:总是验证你的方法的输入!如果事情在某些条件下不起作用,请确保尽一切可能避免这些情况。因为这个方法是私有的,所以CreatArrayAndSetValuesToIndex
就足够了。如果它是公共表面的一部分,你需要抛出一个合适的例外(Debug.Assert
作为一个恰当的想法)。
最后但并非最不重要的是,让我们自己写一个打印出ArgumentOutOfRange
数组的方法,这样我们就可以确保我们的代码运行良好:
int
我已经利用了框架中已有的工具。 private static void PrintOut(int[] array)
{
Console.WriteLine(string.Join(Environment.NewLine, array);
}
是一个漂亮的小方法,它接受任何可枚举的对象(数组就是其中之一),并使用给定的分隔符(在本例中为新行)创建其所有成员的字符串。
现在,剩下的就是把它们放在一起:
string.Join
我们完成了!