如何将列添加到数组C#

时间:2016-11-23 09:31:11

标签: c# arrays loops

我能够创建一个使用输入的动态数组,但是我需要一个未由用户输入的起始固定数组:

以下是一个例子:

输入和打印的数组是:

  

1 2 3 4 5

     

1 2 3 4 5

     

1 2 3 4 5

     

1 2 3 4 5

我需要在数组的开头添加一列0,如下所示:

  

0 1 2 3 4 5

     

0 1 2 3 4 5

     

0 1 2 3 4 5

     

0 1 2 3 4 5

谢谢!

6 个答案:

答案 0 :(得分:3)

您只需要使用额外的列初始化矩阵,并在使用用户输入的值填充矩阵的其余部分之前使用您需要的值填充它:

//...
     int[,] matrix = new int[r, c + 1];

     /*Insert Values into Main Matrix
     --------------------------------------------------------------------------------*/

    for (int row = 0; row < r; row++)
    {
        //Fill the first column manually
        matrix[row, 0] = 0; 

        //This loop then starts from the second column, and loops until
        //col <= c instead of just col < c
        for (int col = 1; col <= c; col++)
        {
            Console.Write("Enter value for matrix[{0},{1}] = ", row, col);
            matrix[row, col] = (int)Convert.ToInt32(Console.ReadLine());
        }
    }
//...

答案 1 :(得分:2)

假设您为r和c输入3行和2列。然后输入值。输出是:

1 2

1 2

1 2

但现在我希望它显示为:

0 1 2

0 1 2

0 1 2

行数(垂直)是相同的。但是,由于我已经为0添加了额外的列,所以列数(水平)从2增加到3。

因此,在代码中,我们必须考虑额外的列:

    int r;
    int c;
    Console.Write("Enter number of rows: ");
    r = (int)Convert.ToInt32(Console.ReadLine());
    Console.Write("Enter number of columns: ");
    c = (int)Convert.ToInt32(Console.ReadLine());
    c++; //add an extra column for the added 0's
    int[,] matrix = new int[r, c];

现在我们要将0添加到此列。但我们需要能够指定我们只想为第一列添加0。当我们填充数组时,我们可以添加一个检查来说明如果我们当前填充的列是行的第一列,则自动插入0。

    for (int row = 0; row < r; row++)
    {
        for (int col = 0; col < c; col++)
        {
            if (col == 0)
            {
                matrix[row, col] = 0;
            }
            else
            {
                Console.Write("Enter value for matrix[{0},{1}] = ", row, col);
                matrix[row, col] = (int)Convert.ToInt32(Console.ReadLine());
            }
        }
    }

要求用户输入的第一个条目不再是{0,0},因为第一个条目将自动输入,但您真的关心吗?如果是这样,你可以从显示值中减去1:

    Console.Write("Enter value for matrix[{0},{1}] = ", row, col -1);

答案 2 :(得分:1)

您似乎使用错误的集合类型:2D数组int[,]而不是List<List<int>>

  ...
  // Initialization is quite a complex, but it's the only such a fragment  
  List<List<int>> matrix = Enumerable
    .Range(1, r)              // r columns
    .Select(i => Enumerable   // i - row index which we ignore
      .Range(1, c)            // c columns 
      .Select(index => 0)     // assign each item to 0 
      .ToList())              // inner list
    .ToList();                // outer list

  for (int row = 0; row < r; row++)
  {
     for (int col = 0; col < c; col++)
     {
        Console.Write("Enter value for matrix[{0},{1}] = ", row, col);
        // please, notice [row][col] instead of [row, col]
        matrix[row][col] = (int)Convert.ToInt32(Console.ReadLine());
     }
  }

或者您甚至可以生成初始矩阵

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
   List<List<int>> matrix = Enumerable
     .Range(1, 4)               // 4 rows
     .Select(i => Enumerable    // i - row index which we ignore
        .Range(1, 5)            // 5 columns
        .Select(index => index) // assign 1, 2, ..., 5 to row items
        .ToList())              // inner list
     .ToList();                 // outer list  

没有任何用户输入。当你想要添加一列时,它就像

一样简单
  foreach (var row in matrix)
    row.Insert(0, 0);

在每个0的{​​{1}}位置插入0。测试

row

答案 3 :(得分:1)

作为通用方法,简单:

static TElement[,] AppendColumnOnTheLeft<TElement>(TElement[,] before)
{
  var after = new TElement[before.GetLength(0), before.GetLength(1) + 1];
  for (var i = 0; i < before.GetLength(0); ++i)
    for (var j = 0; j < before.GetLength(1); ++j)
      after[i, j + 1] = before[i, j];

  return after;
}

新列的条目都将具有值default(TElement),即0nullfalse等。

答案 4 :(得分:0)

尝试以下代码

 int r;
            int c;
            Console.Write("Enter number of rows: ");
            r = (int)Convert.ToInt32(Console.ReadLine());
            Console.Write("Enter number of columns: ");
            c = ((int)Convert.ToInt32(Console.ReadLine()) + 1);
            int[,] matrix = new int[r, c];

            /*Insert Values into Main Matrix
             --------------------------------------------------------------------------------*/
            for (int row = 0; row < r; row++)
            {
                for (int col = 0; col < c; col++)
                {
                  if(col == 0)
                  {
                    matrix[row, col] = 0;
                  }
                  else{
                    Console.Write("Enter value for matrix[{0},{1}] = ", row, col-1);
                    matrix[row, col] = (int)Convert.ToInt32(Console.ReadLine());
                  }
                }
        }

答案 5 :(得分:0)

Array.Copy将允许您复制数组并将其移过,例如

    int[,] arr =  { 1, 2, 3, 4, 5 } ;
    int[,] newarr = new int[6];
    Array.Copy(arr, 0, newarr, 1, arr.Length);

我缩短了你的数组用于输入目的等,但这会导致数组{0,1,2,3,4,5}你不能将它应用到多行,所以你需要迭代你的行,我认为它有用,但我检查了它并没有。那么你就可以只对矩阵中的每一行,将1行复制到新矩阵中,完成工作......