如何将值添加到2D数组中的特定列?

时间:2019-06-17 15:49:51

标签: c# multidimensional-array

我想每次用户尝试约会时都要填写该值。约会有两种类型:约会a和约会b。每次约会一天只能做4次。因此,我的维度将有两列用于约会类型,而四行则包含四个约会。我只是尝试如果用户只键入“ a”。 如果用户第一次键入“ a”,则我的2D数组将如下所示:

1111
1000

如果用户第二次键入“ a”,则2D数组将如下所示:

1111
1200

以此类推...因此,最终2D数组将如下所示:

1111
1234

  int[,] slots = new int[4,2];
  string appt_type;
  string choice = "Y";
  while (choice == "Y")
  {
    Console.WriteLine("Please enter a or b");
    appt_type = Console.ReadLine();
    if (appt_type == "a")
    {
      for (int i=0; i<slots.GetLength(0); i++) 
      {
        for (int j=0; j<slots.GetLength(1); j++) 
        {
          slots[i,0] = 1;
          slots[i,j] = i+1;
        }
      }

      int q = 0;
      foreach (int i in slots)
      {
        if ((q%2) == 1)
          Console.WriteLine(i + " ");
        else
          Console.Write(i + " ");
        q++;
      }
  }

}

我的最终输出是我所期望的。但是,我希望每次用户输入“ a”时都填充第二列。

首先输入“ a”

1111 1000

第二次输入“ a”

1111 1200

第三次输入“ a”

1111 1230

第四次输入“ a”

1111 1234

2 个答案:

答案 0 :(得分:0)

首先,您的for循环不是您想要的,因为在用户输入您已经在for循环内的for循环中初始化的“ a”或“ b”之前,该数组应该放在最后在for循环之后,数组为1111 1234。

您可以创建一个计数器变量,以计算每次获得输入时用户输入“ a”的次数。在这种情况下,数组的行与“用户已输入a”,因此即使只有再次输入“ a”它的值才会增加,我仍将计数器初始化为0。用户输入“ a”的数量为1,因为肯定是1在它进入forloop之后,这就是为什么您还可以将其设置为要更改的数组元素的原因。

此外,您可以使用while(true)而不是创建变量并将其保持不变。 几乎是这样的:(试图用您的方式打印它)

  int[,] slots = new int[4, 2];
        string appt_type;
        int counter = 0;//counts how many times the user had enter the letter "a"
        while (true)
        {
            Console.WriteLine("Please enter a or b");
            appt_type = Console.ReadLine();
            if (appt_type == "a")
            {
                counter++;
                for (int i = 0; i < slots.GetLength(0); i++)
                {
                    for (int j = 0; j < slots.GetLength(1); j++)
                    {
                        slots[i, 0] = 1;
                        slots[counter - 1,1 ] = counter;//note:all of the elements that you want to change are in column 1 of the array
                    }
                }
                int q = 1;//the position of i in the array
                foreach (int i in slots)
                {
                    if(q%2!=1)
                        Console.WriteLine(i+" " );
                    else
                        Console.Write(i);
                    q++;
                }

答案 1 :(得分:0)

为了使您的代码允许用户输入他/她的选择并使代码根据该选择执行某项操作,您需要检查元素的值是否为0或其他,然后根据该值执行某项操作值。这是一个未经测试的快速修复程序,但是您可以获取要点:

for (int i=0; i<slots.GetLength(0); i++)
{
    for (int j=0; j<slots.GetLength(1); j++) 
    {
        if (slots[i,j] == 0)
        {
            slots[i,j] = i+1;
            break;
        }
    }
}

我认为您的代码仍可以通过许多其他方式进行改进。这是我的建议:

  • 在方法中分解代码,使其更易于阅读。 选择 A 时,选择 B 时分开例程 当显示插槽时。
  • 很明显,选择选项 A 后, 数组设置为1111,并且直到最后都不会更改,因此将其设置为 一次,通过检查第一个是否忘记了它 该列的元素等于1。
  • 您不必遍历第二列中的所有元素 仅用于设置值。只需检查您遇到的第一个0 并将其设置为当前索引+1。
  • 使用break可以轻松退出循环并消除花括号 使代码看起来更简洁。
  • 比较字符串时忽略大小写,因为a != A

这里是建议和经过测试的重构。在while(true)上添加一个断点,使其在调试模式下运行,并查看代码在每个用户输入上的流向:

class Program
{
    static void Main(string[] args)
    {
        var slots = new int[4, 2];
        while (true)
        {
            Console.Write("Do you want to proceed? [Y/N]");
            var choice = Console.ReadLine();

            if (!choice.Equals("y", StringComparison.CurrentCultureIgnoreCase))   
                break;

            Console.WriteLine("Please enter a or b: ");
            var appt_type = Console.ReadLine();

            if (appt_type.Equals("a", StringComparison.CurrentCultureIgnoreCase))
                slots = AssignScheduleA(slots);

            else if (appt_type.Equals("b", StringComparison.CurrentCultureIgnoreCase))
                AssignScheduleB(slots);

            DisplaySlotsValue(slots);
        }
    }

    private static int[,] AssignScheduleA(int[,] slots)
    {
        if (slots[0,0] != 1)
        {
            for(int idx1 = 0; idx1 < slots.GetLength(0); idx1++)
                slots[idx1, 0] = 1;
        }    

        for(int idx2 = 0; idx2 < slots.GetLength(0); idx2++)
        {
            if (slots[idx2, 1] == 0)
            {
                slots[idx2, 1] = idx2 + 1;
                break;
            }
        }

        return slots;
    }

    private static void AssignScheduleB(int[,] slots)
    {
        throw new NotImplementedException();    
    }

    private static void DisplaySlotsValue(int[,] slots)
    {
        for (int idx1 = 0; idx1 < slots.GetLength(0); idx1++)
            Console.Write(slots[idx1, 0]);

        Console.WriteLine();

        for (int idx2 = 0; idx2 < slots.GetLength(0); idx2++)
            Console.Write(slots[idx2, 1]);

        Console.WriteLine();
    }
}

如果在调试模式下进行此操作,您将了解代码如何使用户每次都能做出选择并根据选择填写数组。仍然可以改进此代码,并且可以在学习有关C#的知识时做一些事情。编码愉快!