C# 使用参数从 main class 调用方法
C# Calling a method from the main class with parameters
所以我有这个程序,基本上我想做的是生成一个包含 20 个元素的随机数组,然后根据用户输入的值将其中的值移动多个位置。因此,如果用户输入 5,则数组将移动 5 个位置,并且输出的数组将在其第一个索引 [0] 处具有索引 [6] 的值(因为索引从 0 -> 5+1 开始)并且在索引 [ 1]原索引的值[7]等等。
我面临的问题在于输入参数。我试图给出用户给出的值,所以如果用户输入 5,那么我将 "shiftValueX" 作为“_shiftValueX”提供给方法以使用它。
然而,在下面的 "ToString" 方法中,我正在打印 "shiftPos()" 方法,我收到此错误 "There is no argument given that corresponds to the required formal parameter"。我应该怎么办?我尝试将参数放入在 ToString 部分调用的方法,但没有任何效果。我是以错误的方式调用方法吗?我该如何解决?非常感谢。
这是Class"Arrays"
class Arrays
{
//constants
public const int AMOUNT_OF_VALUES = 20;
public const int MAX_RND_VALUES = 100;
private int[] array = new int[AMOUNT_OF_VALUES];
//Random Generator
private static Random rnd = new Random();
//Class Constructors
public Arrays(int[] num)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = num[i];
}
}
public Arrays()
{
for (int i = 0; i < array.Length; i++)
{
array[i] = rnd.Next(MAX_RND_VALUES);
}
}
//Methods
public int[] shiftPos(int _shiftValueX)
{
int y = 0;
int[] array2 = new int[AMOUNT_OF_VALUES];
for (int i = _shiftValueX; i <= (array.Length - 1); i++)
{
array2[y] = array[i];
y++;
}
for (int i = 0; i < (array.Length - (_shiftValueX)); i++)
{
array2[y] = array[i];
y++;
}
return array2;
}
//Override ToString Method
public override string ToString()
{
return "The original array was: " + string.Join(", ", array.Select(v => v.ToString())) + "\n" +
"The rotated array is: " + string.Join(", ", shiftPos().Select(v => v.ToString()));
//This is where I'm getting the error ^
}
}
这是"Main Program"
class Program
{
//constants
public const int AMOUNT_OF_VALUES = 20;
static void Main(string[] args)
{
Console.WriteLine("How many places will the values be shifted: ");
int shiftValueX = int.Parse(Console.ReadLine());
Arrays myArray = new Arrays();
myArray.shiftPos(shiftValueX);
Console.WriteLine(myArray);
}
}
对,事实上你的逻辑有点不对。正如 MarcoLaser 之前所说,当你在你的 main 中调用你的 myArray.shiftPos(shiftValueX);
时,你使用一个单独的数组,然后你 return。这意味着您的 Arrays
class 中的数组保持不变。
您最有可能做的是在 shiftPos
方法中更改 Arrays
实例中的数组。您仍然可以 return 您的第二个数组,但您还应该设置数组
this.array = array2;
return array2;
通过这种方式,您可以在 toString()
覆盖中使用存储在实例中的私有数组,而不是在 toString 中调用 shiftPos。
您还说您也需要原始数组,所以只需将 array2
存储在不同的 private
变量中即可。
另一种解决方法虽然有点奇怪,但 shiftPos 并没有真正执行逻辑,而是让它将用户值存储在 class 实例中,这样您就可以在到字符串方法。虽然这是一种奇怪的处理方式,但我建议您使用第一种方法。
所以我有这个程序,基本上我想做的是生成一个包含 20 个元素的随机数组,然后根据用户输入的值将其中的值移动多个位置。因此,如果用户输入 5,则数组将移动 5 个位置,并且输出的数组将在其第一个索引 [0] 处具有索引 [6] 的值(因为索引从 0 -> 5+1 开始)并且在索引 [ 1]原索引的值[7]等等。
我面临的问题在于输入参数。我试图给出用户给出的值,所以如果用户输入 5,那么我将 "shiftValueX" 作为“_shiftValueX”提供给方法以使用它。
然而,在下面的 "ToString" 方法中,我正在打印 "shiftPos()" 方法,我收到此错误 "There is no argument given that corresponds to the required formal parameter"。我应该怎么办?我尝试将参数放入在 ToString 部分调用的方法,但没有任何效果。我是以错误的方式调用方法吗?我该如何解决?非常感谢。
这是Class"Arrays"
class Arrays
{
//constants
public const int AMOUNT_OF_VALUES = 20;
public const int MAX_RND_VALUES = 100;
private int[] array = new int[AMOUNT_OF_VALUES];
//Random Generator
private static Random rnd = new Random();
//Class Constructors
public Arrays(int[] num)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = num[i];
}
}
public Arrays()
{
for (int i = 0; i < array.Length; i++)
{
array[i] = rnd.Next(MAX_RND_VALUES);
}
}
//Methods
public int[] shiftPos(int _shiftValueX)
{
int y = 0;
int[] array2 = new int[AMOUNT_OF_VALUES];
for (int i = _shiftValueX; i <= (array.Length - 1); i++)
{
array2[y] = array[i];
y++;
}
for (int i = 0; i < (array.Length - (_shiftValueX)); i++)
{
array2[y] = array[i];
y++;
}
return array2;
}
//Override ToString Method
public override string ToString()
{
return "The original array was: " + string.Join(", ", array.Select(v => v.ToString())) + "\n" +
"The rotated array is: " + string.Join(", ", shiftPos().Select(v => v.ToString()));
//This is where I'm getting the error ^
}
}
这是"Main Program"
class Program
{
//constants
public const int AMOUNT_OF_VALUES = 20;
static void Main(string[] args)
{
Console.WriteLine("How many places will the values be shifted: ");
int shiftValueX = int.Parse(Console.ReadLine());
Arrays myArray = new Arrays();
myArray.shiftPos(shiftValueX);
Console.WriteLine(myArray);
}
}
对,事实上你的逻辑有点不对。正如 MarcoLaser 之前所说,当你在你的 main 中调用你的 myArray.shiftPos(shiftValueX);
时,你使用一个单独的数组,然后你 return。这意味着您的 Arrays
class 中的数组保持不变。
您最有可能做的是在 shiftPos
方法中更改 Arrays
实例中的数组。您仍然可以 return 您的第二个数组,但您还应该设置数组
this.array = array2;
return array2;
通过这种方式,您可以在 toString()
覆盖中使用存储在实例中的私有数组,而不是在 toString 中调用 shiftPos。
您还说您也需要原始数组,所以只需将 array2
存储在不同的 private
变量中即可。
另一种解决方法虽然有点奇怪,但 shiftPos 并没有真正执行逻辑,而是让它将用户值存储在 class 实例中,这样您就可以在到字符串方法。虽然这是一种奇怪的处理方式,但我建议您使用第一种方法。