【发布时间】:2023-03-31 04:05:02
【问题描述】:
我不知道我在这里做错了什么。这段代码的目的是 改变序列中两个值的位置。
当我在控制台输入 Switch 78 97 时,它可以很好地完成工作,但反之则无法正常工作:Switch 97 78
这是完整的代码
static void Main()
{
List<int> numbers = Console.ReadLine().Split(" ").Select(x => int.Parse(x)).ToList();
string command;
while((command = Console.ReadLine())!= "END")
{
string[] execute = command.Split();
string type = execute[0];
switch (type)
{
case "Change":
int firstNumber = int.Parse(execute[1]);
int secoundNumber = int.Parse(execute[2]);
ChangeNumber(firstNumber, secoundNumber, ref numbers);
break;
case "Hide":
HideNumber(ref numbers, execute);
break;
case "Switch":
SwitchNumber(ref numbers, execute);
break;
case "Insert":
InsertNumber(ref numbers, execute);
break;
case "Reverse":
Reverse(ref numbers, execute);
break;
}
}
foreach (var item in numbers)
{
Console.Write(item + " ");
}
}
//Switch {paintingNumber} {paintingNumber2} – find the given paintings in the collections
//if they exist and switch their places.
static void SwitchNumber(ref List<int> numbers, string[] execute)
{
if (numbers.Contains(int.Parse(execute[1])) && numbers.Contains(int.Parse(execute[2])))
{
int paintingNumber1 = int.Parse(execute[1]); // 97
int paintingNumber2 = int.Parse(execute[2]); // 78
int temp = int.Parse(execute[1]); // 97
numbers[numbers.IndexOf(paintingNumber1)] = paintingNumber2; // 5 = 78
numbers[numbers.IndexOf(paintingNumber2)] = temp; // 6 = 97
}
}
【问题讨论】:
-
int.Parse(execute[1])没有必要运行四次。运行一次,然后分配给一个变量并使用该变量。 -
在
[]调用之前在两个IndexOf调用之前两个 调用。问题是您的第二次IndexOf调用是找到您刚刚停留在execute[1]的索引中的值,而不是execute[2]的索引。 -
还有
ref List<int>是pretty pointless。 -
来自
List<T>.IndexOf的文档:“返回 List或其一部分中第一次出现的值的从零开始的索引。”(docs.microsoft.com/en-us/dotnet/api/…)。注意这里它找到了第一次出现。一旦您更改了第一个值,如果该值在列表中较早,它将返回该索引以进行第二次更改(有效地还原更改) -
这样的设计存在很多问题。如果您碰巧解决了原始(逻辑)问题,请尝试回答以下问题:
1.当用户在Switch命令中输入少于两个参数时会发生什么?2.如果有两个以上的参数会怎样?3.如果 args 不是整数怎么办?4.如果输入的数字不在列表中怎么办?5。如果用户键入小写开关怎么办? ...我可以继续。
标签: c# generic-list