【问题标题】:Create Array with Dimension selected by User使用用户选择的维度创建数组
【发布时间】:2020-12-21 14:34:14
【问题描述】:

用户应选择维度 (1, 2)。用户选择维度后,应创建一个具有该维度的数组。在此之后,数组将被随机填充、排序和打印。 我为此创建了引用一维或二维数组的方法。

我现在唯一的问题是两个数组需要具有相同的名称 (arr),因为后面的方法只将 arr 作为参数。

我尝试在选择 array-dim 之前创建一个 var 变量。但是使用 var 我需要指定变量的类型,所以我不能简单地使用var arr;

我的问题有什么解决办法吗?我真的不知道如何解决这个问题。

最后我想要这样的东西:

        var arr;
        switch (arrDim)
        {
            case 1:
                arr = Fill1DArrayRandom();
                break;
            case 2:
                arr = Fill2DArrayRandom();
                break;
        }


        PrintArray(arr);

        switch (chosenAlgo)
        {
            case 1:
                Algorithms.InsertionSort.Sort(ref arr);
                break;
                ...

采用一维或二维数组的方法。

 static void PrintArray(int[] arr) ...
    
 static void PrintArray(int[,] arr) ...

 static bool IsSorted(ref int[] arr) ...
 
 static bool IsSorted(ref int[,] arr)
 {
      for (int i = 0; i < arr.Length - 1; i++)
           for (int j = 0; j < arr.Length - 1; j++)
                if (arr[i,j] > arr[i-1,j-1])
                     return false;
      return true;
 }

【问题讨论】:

  • 您可以直接使用类型Array或使用泛型List&lt;List&lt;int&gt;&gt;
  • 另一种解决方案是有一个一维数组并模拟多维。
  • @Vernou 如果我使用 Array 类型,我的方法如何知道它是一维数组还是二维数组?因为那 Method 的参数必须是 Array 类型的。如果是这样,我无法使用这些方法。
  • 属性Array.Rank返回维数。

标签: c# arrays dynamic dimensions custom-dimensions


【解决方案1】:

一个丑陋的解决方案是创建一个对象,然后将其转换为 int[] 数组,如下所示:

var arr = new object();

// switch here
arr = new int[5] { 1 ,2,3, 4, 5};
Console.WriteLine((arr as int[])[0]);
arr = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
Console.WriteLine((arr as int[,])[0, 0]);

和打印:

    private static void Print(object arr) 
        {
            if (arr.GetType() == typeof(int[,]))
            {
                int[,] myArr = arr as int[,];
                Console.WriteLine(myArr[0, 0]);
                // do stuff here with 2D array
            } 
            else 
            {
                int[] myArr = arr as int[];
                Console.WriteLine(myArr[0]);
                // do stuff here with 1D array
            }
        }

【讨论】:

  • 我仍然必须在每次调用方法时指定数组是 1D 还是 2D PrintArray(arr as int[]);PrintArray(arr as int[,]);
  • 我可以给方法类型对象作为参数,但是我不能像arr.Lengtharr[0] = 0那样访问数组
  • 您可以将其反向转换为对象,然后传递给您的方法并使用 if 子句验证 arr.GetType() 是否为 int[] 或 int[,] 然后再次执行打印转换回访问数组方法的正确类型
  • 这将是一个丑陋的解决方案,我不得不重写我所有的方法,这真的是唯一的解决方案吗?
  • 恐怕,您不能以相同的方式处理两种不同类型的对象,您必须将它们转换为您可以使用的其他对象。我用打印解决方案更新了答案。
猜你喜欢
  • 2015-12-21
  • 2014-02-20
  • 2016-08-29
  • 2022-01-10
  • 1970-01-01
  • 2023-04-05
  • 2020-12-09
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多