2017-11-11 137 views
0

我想通过创建一个小程序来练习创建数组,该程序允许用户输入数组中的元素数量,然后创建一个数组用户输入的元素,并用数字填充所有元素。例如:如果输入3,则会生成3个元素,将元素1填入数字1,数字2填入数字2,依此类推。虽然我每次都得到一个特定的错误:CS0021无法应用与[]的索引类型为 这里的“法团”的表达是我的代码:数组设置抛出启动时出现错误 - CS0021错误(C#)

 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; 
     } 

感谢提前,如果你决定要帮我出:)

+1

'Array'已解析为方法的名称'void Array(int input)'。你想做什么?你的方法'Array'没有任何数组可用。 – InBetween

+0

嗯,我刚刚意识到我不应该问。被mindboggled很长一段时间,它错误,因为我声明数组和使用数组? (注意上限) 编辑:不,它不是,那不是原因。 – ImNotCrazy

+0

另外,我想要做的是我试图给它的数字元素。 int [] array = new int [num];使用特定数量的元素声明一个数组...并且array [inum] = num;应该给这些元素数字。 :/ – ImNotCrazy

回答

0

在你的prgoram 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); 
    } 
} 

在main方法:

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); 
} 

否则你可以使用一个简单的LINQ声明:

Enumerable.Range(1, input).ToArray(); 
+0

谢谢,从Array更改为CreateArray的方法,它的工作!非常感谢! – ImNotCrazy

0

好的,让我们稍微整理一下你的代码,并尽量让它做你想做的事:

让我们从你的任何逻辑开始,从你的方法Main,并写出具体的方法,采取小步骤实现你的目标。请记住,你制作方法越小,你就越难找到一个bug。如果你正在学习,开始荒谬的小事,随着你的信心增长变得更大。

好的,有一个要求用户输入数字的概念,让我们编写一个方法来实现这一点,并尽可能在过程中尽可能强健。请记住,用户是愚蠢的!要求一个号码,他们会输入什么,但:

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是从string中提取int的安全方式;如果有可能这样做,它会给你一个号码并返回true,否则会返回false。如果它失败了,它不会做的就是炸毁你的脸,这是int.Parse非常乐意去做的事情。避免Parse喜欢瘟疫,总是使用frendlier 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; 
} 

CreatArrayAndSetValuesToIndex似乎荒谬长的名字,但它会告诉你什么方法呢。习惯使用描述性名称并避免缩写。现在使用intellisense,使用简短的神秘名字是没有意义的。

另请注意参数验证。我永远不会强调这一点:总是验证您的方法输入!。如果事情在某些条件下不应该起作用,那么确保你正在尽一切可能来避免这些情况。由于该方法是私人的,Debug.Assert就足够了。如果它是公共表面的一部分,你需要抛出一个适当的例外(ArgumentOutOfRange作为一个合适的例子)。

最后但并非最不重要的,让我们写自己,打印出int阵列,这样我们可以确保我们的代码是运作良好的最后一个方法:

private static void PrintOut(int[] array) 
{ 
    Console.WriteLine(string.Join(Environment.NewLine, array); 
} 

我已经采取了这里利用了已有的工具该框架。 string.Join是一个非常漂亮的小方法,它接受任何可枚举对象(数组就是其中之一),并使用给定的分隔符创建其所有成员的字符串,在这种情况下为新行。

而现在,所有这就是左边是把他们放在一起:

static void Main(string[] args) 
{ 
    var size = PromptUserForPositiveInteger("Enter array size: "); 
    var array = CreatArrayAndSetValuesToIndex(size); 
    PrintOutArray(array); 
    Console.ReadLine(); 
} 

,我们就大功告成了!