Как создать массив в конструкторе, который будет использоваться позже - PullRequest
0 голосов
/ 09 февраля 2019

Я делаю класс Matrix и хочу, чтобы конструктор также вводил тип Matrix.Как я могу инициализировать определенный тип 2d массива?

public class Matrix
    {
        public int[][] matrix;
        //??


        Matrix(int x,int y,string type)
        {
            switch (type)
            {
                case "int":
                    //initialize a int 2d array
                case "double":
                    //initialize a double 2d array
                case "float":
                    //initialize a float 2d array
                default:
                   //initialize a float 2d array
                   break;

           }

       }
   }

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Стандартный подход заключается в использовании обобщенных типов вместо имени строки типа, подобного Matrix<T>.

Если вы хотите указать тип как строку во время выполнения, вам нужно либо добавить несколько полей для хранения каждоготип массива или используйте dynamic или object в качестве типа массива (поскольку вы не можете присвоить float[][] полю типа int[][]).

Для кода, не чувствительного к производительности IВы можете использовать dynamic, поскольку он даст вам код, который выглядит разумно (вы теряете intellisense и безопасность времени компиляции) и в любом случае проверяет все операции во время выполнения.

public class Matrix
{
    dynamic matrix;

    Matrix(int x,int y,string type)
    {
        switch (type)
        {
            case "int":
                matrix = 
                   Enumerable.Repeat(0, x).Select(_ => new int[y]).ToArray();
                break;
            case "double":
                //initialize a double 2d array
                matrix = 
                   Enumerable.Repeat(0, x).Select(_ => new double[y]).ToArray();
                break;
            case "float":
            default:
                //initialize a float 2d array
                matrix = 
                   Enumerable.Repeat(0, x).Select(_ => new float[y]).ToArray();
                break;
         }
     }
 }

Об инициализации массива см. Многомерный массив вопрос.

0 голосов
/ 09 февраля 2019

Изучите генерики

public class Matrix<T> 
{    
    public T[,] matrix;

    public Matrix<T>(int x, int y)
    {
        matrix = new T[x, y];
    }
}

Вероятно, вы можете найти существующий, хорошо протестированный класс Matrix где-нибудь в Интернете.

0 голосов
/ 09 февраля 2019

Обобщения с ограничением new могут помочь, если тип может быть объявлен во время разработки

public class Matrix<T> where T : new()
{
   public T[][] matrix;
   public Matrix(int x, int y)
      => matrix = Enumerable.Range(0,x).Select(elem => new T[y]).ToArray();    
}

Использование

var something = new Matrix<int>(4,4);
...