c# - 如何创建具有未知行数但已知列数的二维数组?

时间:2017-06-11 23:31:25

标签: c# arrays list

我正在尝试使用两列创建二维int数组,但行数未知。我知道为了创建2D数组本身,我做了以下几点:

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

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

4 个答案:

答案 0 :(得分:2)

无法创建具有未知数量元素的2D数组(或任何其他类型的数组)。初始化后,您必须提供多个元素。

多维数组的语法如下:

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<List<int>> table = new List<List<int>>();
table.Add(Enumerable.Repeat(defaultValue, numberOfColumns).ToList());

要添加列,您需要这样的内容:

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

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

然而如果你需要一个固定数量的列,你可以使用的最好的替代方法是声明一个新的类,你的列映射到类的属性,然后简单地声明一个List就像它是在下面的answer中描述为@ shash678指向

答案 1 :(得分:2)

您可以使用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 :(得分:1)

原始答案:考虑使用List<Tuple<int, int>>

说明:首先,int[]不是List<>。根据您的问题的精神,您似乎需要将几个数据单元与有限大小组合在一起,就像表中的记录一样。您可以决定使用更具描述性的名称创建POCO(这将增加代码可读性和帮助语义),使用固定大小的数组或使用元组。由于没有提到需要可变性,并且内部“数组”的大小将被修复,我会建议一个元组。通过类型安全,您将确保添加到元组列表中的每个新对象的大小和形状是正确的。

你的第一个问题和第二个问题将得到关注,至于第3个问题,请参阅:Tuple Pair

e.g。 list.Add(Tuple.Create<int,int>(1,1));

答案 3 :(得分:0)

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

        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();