Портирование Java (Android) на C# (WinForms)


Я уже писал о заказе на перенос кода C# на Java, а тут хочу рассказать о работе по обратному портированию. Итак, как перенести проект Android, рассчитывающий по формулам различные значения: диапазон, вероятность, степень свободы и критерий хи-квадрата.



Сначала я не хотел браться, так как не работаю с Andriod – там хоть и java, но немного отличающаяся Java, есть нюансы и тонкости. Однако, заказчик давний и хороший, поэтому ршил посмотреть. Исходник оказался состоящим из одного файла MainActivity.java и на первый взгляд не требовал подключения каких-то специфических библиотек, поэтому я решил все-таки сделать этот заказ.

Поля класса MainActivity

private Float[] arrayInt;
    private int N;
    private  float a, b;
    private  float[] tableHi;
    private String buff;
переводятся просто:

private double[] arrayInt;
        private int N;
        private float a, b;
        private float[] tableHi;
        private String buff;
Далее в программе семь методов и каждый из них необходимо преобразовать из Java в C#. Для примера возьмем метод ReadTableHi()

private void ReadTableHi() {
        tableHi = new float[21];
        File file = new File("/sdcard/","hi.txt");
        StringBuilder text = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            int i = 0;
            while ((line = br.readLine()) != null) {
                tableHi[i] = Float.valueOf(line);
                i++;
            }
            br.close();
            Toast toast = Toast.makeText(this, "Таблица ХИ-квадрат критерия загружена/ \n Первое значение " + tableHi[0],Toast.LENGTH_LONG);
            toast.show();
        }
        catch (IOException e) {
            Toast toast = Toast.makeText(this, e.getMessage(),Toast.LENGTH_LONG);
            toast.show();
        }
    }
Он загружает в программу числа из файла вот в таком формате.



Преобразованный метод получается таким

private void ReadTableHi()
        {
            tableHi = new float[21];
            string[] lines = File.ReadLines("hi.txt").ToArray(); ;
            for (int i=0; i< lines.Length; i++)
            {
                tableHi[i] = float.Parse(lines[i]);

            }
            MessageBox.Show("Таблица ХИ-квадрат критерия загружена \n Первое значение " + tableHi[0]);
        }
Я убрал обработку ошибок, так как мы точно знаем, что файл у нас будет. Или вот метод Generate()

public void Generate(View view) {
        try{
            //Инициализация переменных
            // - КОЛИЕЧЕСТВО СЛУЧАЙНЫХ ЧИСЕЛ
            EditText text_N = findViewById(R.id.n_text);
            N = Integer.valueOf(text_N.getText().toString());
            // - НИЖНЯЯ ГРАНИЦА ДИАПАЗОНА
            EditText text_a = findViewById(R.id.a_text);
            a = Float.valueOf(text_a.getText().toString());
            // - ВЕРХНЯЯ ГРАНИЦА ДИАПАЗОНА
            EditText text_b = findViewById(R.id.b_text);
            b = Float.valueOf(text_b.getText().toString());
            // - МАССИВ СЛУЧАЙНЫХ ЧИСЕЛ
            arrayInt = new Float[N];
            String helpArrayInt = "";

            //Отчистка текстового поля
            EditText listArray = findViewById(R.id.array_list);
            listArray.setText("");

            //Генерация массива случайных чисел
            for (int i = 0; i < N; i++){
                float randomInt = (float)( Math.random() * (b - a) ) + a;
                arrayInt[i] = randomInt;
                helpArrayInt += "[" + randomInt + "]";
            }

            //Отображение массива сл. чисел на экране
            listArray.setText("Массив случайных чисел из [" + N + "] элементов: \n" + helpArrayInt);

            //Включение кнопки расчёта
            Button Cal = findViewById(R.id.cal_bot);
            Cal.setClickable(true);
            Cal.setEnabled(true);
        }catch (Exception e){
            EditText listArray = findViewById(R.id.array_list);
            listArray.setText(e.getMessage());
        }
    }
Его аналог на C#:

public void Generate()
        {
            try
            {
                //Инициализация переменных
                // - КОЛИЕЧЕСТВО СЛУЧАЙНЫХ ЧИСЕЛ
                N =  (int) numericUpDown1.Value;
                // - НИЖНЯЯ ГРАНИЦА ДИАПАЗОНА
                a = (int)numericUpDown2.Value;
                // - ВЕРХНЯЯ ГРАНИЦА ДИАПАЗОНА
               b = (int)numericUpDown3.Value;
                // - МАССИВ СЛУЧАЙНЫХ ЧИСЕЛ
                arrayInt = new double[N];
                String helpArrayInt = "";

                //Отчистка текстового поля
               // EditText listArray = findViewById(R.id.array_list);
             //   listArray.setText("");

                //Генерация массива случайных чисел
                for (int i = 0; i < N; i++)
                {
                    double randomInt = (double)(RandomNumber() * (b - a)) + a;
                    arrayInt[i] = randomInt;
                    helpArrayInt += "[" + randomInt + "]";
                }

                //Отображение массива сл. чисел на экране
              textBox1.Text = "Массив случайных чисел из [" + N + "] элементов: \n" + helpArrayInt;


            }
            catch (Exception e)
            {
            }
        }
Так как в NET нет встроенного метода Math.random() для чисел типа float или double, то приходится писать свой метод:

public double RandomNumber()
    {       
		string str = "0," + random.Next(0, 99999999).ToString() + random.Next(0, 99999999).ToString();
		double fl = Convert.ToDouble(str);
		return fl;
	}
Так и с остальными функциями. Это интересный процесс. Если вам требуется конвертировать код Java в C# или наоборот – пишите.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, java, си шарп, портирование, перенос кода




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 7. Простая отправка email в Laravel через smtp
Рекурсия папок с помощью C#
Урок 2. Основные ключевые слова Java: практика и тестирование