2d int数组的数字列表

时间:2011-10-08 16:57:50

标签: c# arrays textbox

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

1 1 1

2 2 2

...

所以我想将其转换为二维数组。我知道使用.ToArray()或Regex.Split()获取1d列表,但我不知道如何将其用于2d。我也尝试在string []数组上使用这些函数使其成为2d,但是出现了错误。

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

3 个答案:

答案 0 :(得分:1)

在这里,如果您不理解任何部分,请在评论中提问:

        // 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]);
            }
        }

答案 1 :(得分:1)

这将为您提供一个漂亮的锯齿状2D数组,它不依赖于具有相同长度的所有文本框。如果你需要它们都是相同的长度,那么检查它是微不足道的。

string[] data = // text input from all the text boxes

var result = data.Select(x => x.Split(' ')
    .Select(y => int.Parse(y)).ToArray())
    .ToArray();

结果不是一个int [,]而是一个int [int []],这实际上是一样的。

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

答案 2 :(得分:0)

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

  // 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中产生更好的性能。