2d int数组中的数字列表

本文关键字:数字 列表 int 数组 2d | 更新日期: 2023-09-27 18:10:49

我在文本框上有一个数字列表,如下所示(使用的数字只是示例):

1 1 1

2

我想把它转换成二维数组。我知道使用。toarray()或Regex.Split()的1d列表,但我不知道如何使用它的2d。我也试过在字符串[]数组上使用这些函数使其成为2d,但有一个错误。

而且,数组应该是int[,],以便可以比较数组中的值。任何帮助将不胜感激,谢谢!

2d int数组中的数字列表

给你,如果你有任何不明白的地方,请在评论中提问:

        // assuming the numbers are in perfect 2D format in textBox (only 1 newline separates the lines, only 1 space separates numbers in each line and all lines have the same amount of numbers)
        string textWithNumbers = textBox.Text;
        // first put all lines into an string array
        string[] allLines = textWithNumbers.Split(new string[]{Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
        // calculate 2D array's dimension lengths, and initialize the 2Darray
        int rowCount = allLines.Length;
        int columnCount = ((allLines[0].Length + 1) / 2);
        int[,] twoDArray = new int[rowCount, columnCount];
        // we then iterate through the 2D array
        for (int row = 0; row < rowCount; row++)
        {
            // parse each number from string format to integer format & assign it to the corresponding location in our 2D array
            string[] line = allLines[row].Split(' ');
            for (int column = 0; column < columnCount; column++)
            {
                twoDArray[row, column] = int.Parse(line[column]);
            }
        }

这将给你一个漂亮的锯齿2D数组,不依赖于所有的文本框具有相同的长度。如果您需要它们都是相同的长度,则无需检查。

string[] data = // text input from all the text boxes
var result = data.Select(x => x.Split(' ')
    .Select(y => int.Parse(y)).ToArray())
    .ToArray();

Result不完全是int[,],而是int[int[]],两者实际上是一样的。

当然,您需要处理输入验证或错误处理。

让我首先从最简单的解决方案开始,它对用户输入的数据做了很少的假设。例如,它不假设每行都有相同数量的条目等。因此,对于那些在运行此例程之前可能知道为真或可以强制执行的特殊条件,可以对其进行优化。

  // This is the data from the textbox 
  // hardcoded here for demonstration
  string data = "1 1 1" + Environment.NewLine 
    + "2 2 2" + Environment.NewLine 
    + "12 12 12";
  // First we need to determine the size of array dimension
  // How many rows and columns do we need
  int columnCount;
  int rowCount;
  // We get the rows by splitting on the new lines
  string[] rows = data.Split(new string[]{Environment.NewLine}, 
    StringSplitOptions.RemoveEmptyEntries);
  rowCount = rows.Length;
  // We iterate through each row to find the max number of items
  columnCount = 0;
  foreach (string row in rows)
  {
    int length = row.Split(' ').Length;
    if (length > columnCount) columnCount = length;
  }
  // Allocate our 2D array
  int[,] myArray = new int[rowCount, columnCount];
  // Populate the array with the data
  for (int i = 0; i < rowCount; ++i)
  {
    // Get each row of data and split the string into the
    // separate components
    string[] rowData = rows[i].Split(' ');
    for (int j = 0; j < rowData.length; ++j)
    {
      // Convert each component to an integer value and 
      // enter it into the 2D array
      int value;
      if (int.TryParse(rowData[j], out value))
      {
        myArray[i, j] = value;
      }
    }
  }

考虑到上面我们正在考虑每行不具有相同数量元素的可能性,您可能会考虑使用稀疏数组int[][],这恰好也在。net中产生更好的性能。