【问题标题】:How to switch 2 values in a List [closed]如何在列表中切换 2 个值 [关闭]
【发布时间】: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&lt;int&gt;pretty pointless
  • 来自List&lt;T&gt;.IndexOf 的文档:“返回 List 或其一部分中第一次出现的值的从零开始的索引。”(docs.microsoft.com/en-us/dotnet/api/…)。注意这里它找到了第一次出现。一旦您更改了第一个值,如果该值在列表中较早,它将返回该索引以进行第二次更改(有效地还原更改)
  • 这样的设计存在很多问题。如果您碰巧解决了原始(逻辑)问题,请尝试回答以下问题:1. 当用户在Switch 命令中输入少于两个参数时会发生什么? 2. 如果有两个以上的参数会怎样? 3. 如果 args 不是整数怎么办? 4. 如果输入的数字不在列表中怎么办? 5。如果用户键入小写开关怎么办? ...我可以继续。

标签: c# generic-list


【解决方案1】:

问题是在这个调用之后:

numbers[numbers.IndexOf(int.Parse(execute[1]))] = paintingNumber2; // 5 =  78

您实际上将第二个数字移到了第一个数字的位置。如果您现在尝试查找第二个数字的索引,您将得到第一个:

然后你会覆盖错误的值并以你的初始条件结束

解决方案:您需要在开始对列表进行任何操作之前获取索引:

int index_1 = numbers.IndexOf(paintingNumber1));
int index_2 = numbers.IndexOf(paintingNumber2);
numbers[index_1] = paintingNumber2; // 5 =  78
numbers[index_2] = paintingNumber1; // 6 = 97

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多