【问题标题】:c# - How to create 2D array with unknown number of rows, but known number of columns?c# - 如何创建行数未知但列数已知的二维数组?
【发布时间】:2017-06-11 23:31:24
【问题描述】:

我正在尝试创建具有两列但行数未知的二维整数数组。我知道为了创建 2D 数组本身,我执行以下操作:

List<List<int>> myList = new List<List<int>>();

但是如何修改它以指定列数?我如何向这个数组添加一行?

【问题讨论】:

  • 很难理解您的问题。您能否向我们展示您计划在此处存储的一些数据示例?列数可以改变还是一旦设置就固定?行数可以改变还是一旦设置就固定?第 1 列的行数可以与第 2 列不同吗?
  • 这是一个很好的问题/答案,你应该看看stackoverflow.com/a/6723318/6328256
  • 像你得到它一样使用列表。如果您只使用 to 列,那么只需使用两个。无需明确设置两个。如果您在将两个元素添加到当前列表后继续移动到下一个列表,则它可以正常工作。

标签: c# arrays list


【解决方案1】:

您可以使用 int 数组列表。 List 将表示行,并且 List 中的每个 int 数组将是一行。每个数组的长度将等于列数。

     List<int[]> rows = new List<int[]>();
        int[] row = new int[2];
        row[0] = 100;
        row[1] = 200;
        rows.Add(row);

只要每个 int 数组的长度为 2 (int[] row = new int[2]),所有行都会有两列。 List 可以通过这种方式添加任意数量的 int 数组。

【讨论】:

    【解决方案2】:

    无法创建元素数量未知的二维数组(或任何其他类型的数组)。一旦你初始化它,你必须提供元素的数量。

    多维数组的语法如下:

    var arr = new int[k, l, n,...]
    

    您可以创建所谓的锯齿状数组,即数组数组并在循环中对其进行初始化。您仍然需要使用多个子数组对其进行初始化,然后用给定长度的子数组填充:

    var arr = new int[][n];
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = new int[subArrayLength];
    }
    

    你实际上做的是列表列表,它可以有任意数量的任意长度的“行”。您可以通过 List 方法 Add() 将特定长度的新列表添加到外部列表中,就像您可以将元素添加到任何内部列表中一样。

    所以基本上要添加“行”,您需要以下内容:

    List<List<int>> table = new List<List<int>>();
    table.Add(Enumerable.Repeat(defaultValue, numberOfColumns).ToList());
    

    要添加一列,您需要这样的东西:

    foreach (var row in table)
    {
        row.Add(defaultValue);
    }
    

    您似乎想模拟表结构-为此,我建议创建一个类来从内部封装表逻辑,这样任何添加的行都会导致添加当前 numberOfColumns 大小的外部列表,并且添加列将导致向所有外部列表添加一个元素。

    但是如果您需要固定数量的列,您可以使用的最佳选择是声明一个新类,将您的列映射到该类的属性,然后简单地声明一个 List 就像它一样在以下answer 中描述为@shash678 指出

    【讨论】:

    • new List&lt;int&gt;(numberOfColumns) 不会初始化“特定长度的新列表”。情况并非如此,因为 List.Count 仍然为零,因为列表中没有元素(列)...
    【解决方案3】:

    原始答案:考虑使用List&lt;Tuple&lt;int, int&gt;&gt;

    解释:首先,int[] 不是List&lt;&gt;。从您的问题的精神来看,您似乎需要将几个有限大小的数据单元组合在一起,例如表中的记录。您可以决定使用更具描述性的名称创建 POCO(这将提高代码可读性并有助于语义)、使用固定大小的数组或使用元组。由于没有提及可变性的必要性,并且内部“数组”的大小将是固定的,我建议使用元组。通过类型安全,您将确保添加到元组列表中的每个新对象的大小和形状都是正确的。

    您的第一个和第二个问题将得到处理,至于第三个,请参阅:Tuple Pair

    例如list.Add(Tuple.Create&lt;int,int&gt;(1,1));

    【讨论】:

    【解决方案4】:

    我觉得这些答案让你走上了一条糟糕的道路。在学习如何编程时,您还应该考虑最佳实践。在这种情况下,您的代码就是您应该使用的。如果可以避免设置显式数组大小,则应该(在我看来)。为此目的创建了列表。此示例应用程序解释了如何在这种情况下正确使用列表。我个人的看法是尽量避免使用数组。

            int someNumberOfRow = 10;//This is just for testing purposes.
            Random random = new Random();//This is just for testing purposes.
    
            List<List<int>> myList = new List<List<int>>();
    
    
            //add two elements to the an arraylist<int> then add this arraylist to myList arraylist
            for(int i = 0; i < someNumberOfRow; i++)
            {
                //Create inner list and add two ints to it.
                List<int> innerList = new List<int>();
                innerList.Add(random.Next());
                innerList.Add(random.Next());
    
                //Add the inner list to myList;
                myList.Add(innerList);
            }
    
    
            //This prints myList
            for(int i = 0; i < myList.Count; i++)
            {
                Console.WriteLine((i + 1) + ": " + myList[i][0] + " - " + myList[i][1]);
            }
    
            Console.WriteLine("\n\n");
    
            //If the app may scale in the future, I suggest you use an approach similar to this
            foreach(List<int> sublist in myList)
            {
                foreach(int columns in sublist)
                {
                    Console.Write(columns + " ");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 2019-08-17
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多