32 / 34 / 21
Регистрация: 31.03.2018
Сообщений: 472
1

Можно ли использовать функцию .Resize для создания массива?

16.11.2018, 23:21. Показов 2761. Ответов 16
Метки нет (Все метки)

Добрый вечер, уважаемые форумчяне! Подскажите пожалуйста можно ли использовать ф-цию .Resize для создания массива?
Вот таким способом:
C#
1
2
3
Class1 allstudents;
int n = Convert.ToInt32(Console.ReadLine());
Array.Resize(allstudents, allstudents.Count() + n)
Ведь если я не ошибаюсь, при такой записи массив в себе содержит NULL, то можно ли к этому NULL добавлять другое кол-во элементов?
Или из-за того, что нету инициализации, то ничего не выйдет? Если так, то можно ли как-то проинициализировать, чтоб при этом в массиве не было э-нтов, чтоб потом можно было сделать перезапись?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2018, 23:21
Ответы с готовыми решениями:

3ds max для студентов, можно использовать для создания платных игр?
хочу начать делать 3d игру, бесплатные игровые движки есть, а инструмент для 3d моделирования...

3ds max для студентов, можно использовать для создания платных игр?
хочу начать делать 3d игру, бесплатные игровые движки есть, а инструмент для 3d моделирования...

Можно ли использовать wordpress для создания сайта организации?
Можно ли использовать wordpress для создания сайта организации ?

Можно ли использовать картинку для создания трехмерного объекта
Всем добрый день! В общем создаю я проект WPF, и средствами C# на загрузку приложения выставляю...

16
1515 / 413 / 125
Регистрация: 09.01.2018
Сообщений: 890
17.11.2018, 00:01 2
C#
1
2
3
4
5
6
7
8
9
10
11
            var arr = new int[] { };
            var arr_2 = new int[0];
 
            Array.Resize(ref arr, 10);
            Array.Resize(ref arr_2, 5);
 
            Console.WriteLine(arr.Length);
            Console.WriteLine(arr_2.Length);
 
           //out: 10
           //     5
1
Администратор
Эксперт .NET
13855 / 11228 / 4570
Регистрация: 17.03.2014
Сообщений: 22,635
Записей в блоге: 1
17.11.2018, 01:07 3
Лучший ответ Сообщение было отмечено Iangyl как решение

Решение

Iangyl, можно, но зачем если можно использовать обычный new?
C#
1
2
int n = Convert.ToInt32(Console.ReadLine());
Class1[] allstudents = new Class1[n];
Вариант с Array.Resize
C#
1
2
3
int n = Convert.ToInt32(Console.ReadLine());
Class1[] allstudents = null;
Array.Resize(ref allstudents, n);
1
1515 / 413 / 125
Регистрация: 09.01.2018
Сообщений: 890
17.11.2018, 01:16 4
Iangyl, Инициализируйте при создании. Для чего изменять размер, если число студентов вам известно? Метод Array.Resize применяется когда место в массиве заканчивается.
0
32 / 34 / 21
Регистрация: 31.03.2018
Сообщений: 472
17.11.2018, 17:30  [ТС] 5
escoult, у меня именно тот случай - кол-во студентов, которых введет пользователь мне не известно.
0
Модератор
Эксперт .NET
10424 / 7400 / 2030
Регистрация: 21.04.2018
Сообщений: 22,326
Записей в блоге: 2
17.11.2018, 17:35 6
Цитата Сообщение от Iangyl Посмотреть сообщение
у меня именно тот случай - кол-во студентов, которых введет пользователь мне не известно.
Для ввода делается по другому. Объявляется массив списочного типа - List. А при вводе очередного студента, он стразу добавляется в этот список List.Add . На выходе, после окончания ввода, Вы сразу получаете нужный массив без всяких переопределений размера.
0
1515 / 413 / 125
Регистрация: 09.01.2018
Сообщений: 890
17.11.2018, 18:23 7
Цитата Сообщение от Iangyl Посмотреть сообщение
у меня именно тот случай - кол-во студентов, которых введет пользователь мне не известно.
Исходя из вашего кода - число студентов вам известно. Вам нужно сначала получить это число, а затем создать массив нужного размера, а не наоброт.

Вам может быть неизвестно общее число студентов, если вы планируете добавлять их в дальнейшем в тот же массив. Тогда у вас должен быть определен метод добавления, в котором предусмотрена проверка на то, достаточно ли в массиве места. И если недостаточно, то надо расширить в соответсвии с алгоритмом, который вы также должны определить, а не с тем числом, которое введет пользователь. (добавляете блоки фиксированного размера или увеличиваете размер в два раза). В таком случае стоит подумать о применении List<T> вместо массива. (насколько целесообразно использовать именно массив, или того требует задание).
0
Модератор
Эксперт .NET
10424 / 7400 / 2030
Регистрация: 21.04.2018
Сообщений: 22,326
Записей в блоге: 2
17.11.2018, 18:49 8
Цитата Сообщение от escoult Посмотреть сообщение
В таком случае стоит подумать о применении List<T> вместо массива. (насколько целесообразно использовать именно массив, или того требует задание).
Из реально практики, массив целесообразнее только если требуется многомерность....
В конце концов List - это тоже массив (он поддерживает индексатор), но только одномерный, зато с кучей дополнительных возможностей.
Проблема List - Array возникает из-за слабого преподавательского состава. Преподы не переучиваются. Они до сих пор учат так как будто кроме Fortran языков не существует...
1
32 / 34 / 21
Регистрация: 31.03.2018
Сообщений: 472
17.11.2018, 19:47  [ТС] 9
Элд Хасп, escoult, я много видел, что List рекомендуют, и сначало пытался им сделать, но у меня так и не получилось запихнуть объекты в массив List, спросил у препода - он мне вообще сказал делать через обычные массивы и добавлять э-нты через ф-цию, где я буду переписывать массив, слава богу я нашел Array.Resize и упростил себе задачу, но все же у меня вылетают исключения(см 37 строку)
Код:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace II33Bar
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1[] allstudents = null;
            Console.WriteLine("Hi! Welcome in public account DEKANAT");
            Console.WriteLine("What do you want to do?");
            Console.WriteLine("1. Add information.");
            Console.WriteLine("2. Show information.");
            Console.WriteLine("3. Delete information.");
            string temp = " ";
            //choise = Convert.ToInt32(Console.ReadLine());
            Console.Write("Enter number of your choise: ");
            int choise = 0;
            choise = Checking(temp, choise);
            
                
            
            
 
            switch(choise)
            {
                case 1:
                    
                        //adding information
                        int n = 0;
                    Console.Write("Enter quantity of blocks with info: ");
                    n = Checking(temp, n);
                        Array.Resize(ref allstudents, allstudents.Count() + n);
                        for (int x = 0; x < allstudents.Count(); x++)
                        {
                            Console.WriteLine("Add information about student");
                            Console.Write("Enter first name: ");
                            allstudents[x].FirstName = Console.ReadLine();
                            Console.Write("Enter second name: ");
                            allstudents[x].SecondName = Console.ReadLine();
                            Console.Write("Enter father name: ");
                            allstudents[x].FatherName = Console.ReadLine();
                            Console.Write("Enter sex: ");
                            allstudents[x].sex = Console.ReadLine();
                            Console.Write("Enter course: ");
                            allstudents[x].course = Convert.ToInt32(Console.ReadLine());
                            Console.Write("Enter group: ");
                            allstudents[x].FirstName = Console.ReadLine();
                            Console.Write("Enter grade: ");
                            allstudents[x].group = Console.ReadLine();
                        }
                        // entering information
                    
                        break;
                    
                case 2:
                    int numerator = 0;
                    for (int x = 0; x < allstudents.Count(); x++)
                    {
                        numerator++;
                        Console.WriteLine("№" + numerator);
                        Console.WriteLine(allstudents[x].FirstName);
                        Console.WriteLine(allstudents[x].SecondName);
                        Console.WriteLine(allstudents[x].FatherName);
                        Console.WriteLine(allstudents[x].sex);
                        Console.WriteLine(allstudents[x].course);
                        Console.WriteLine(allstudents[x].group);
                        Console.WriteLine(allstudents[x].grade);
                    }
                    break;
                case 3:
                    int k = 0;
                    Console.Write("Which information you want to delete? Write number, please: ");
                    Checking(temp, k);
                    
                    break;
            }
 
           
            
 
            Console.WriteLine("");
 
        }
 
        static int Checking(string any_str, int any_number)
        {
            for(; ; )
            {
                any_str = Console.ReadLine();
                if (Int32.TryParse(any_str, out any_number))
                {
                    break;
                }
                else
                {
                    Console.WriteLine("Error! Please, try again: ");
                }
            }
            return any_number;
        }
    }
}
0
1515 / 413 / 125
Регистрация: 09.01.2018
Сообщений: 890
17.11.2018, 20:23 10
Цитата Сообщение от Iangyl Посмотреть сообщение
но все же у меня вылетают исключения(см 37 строку)
Так он у вас null, а вы пытаетесь определить его Count.
Вот простой пример, как использовать List<T>

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            List<Student> _students = new List<Student>();
 
            Console.WriteLine("Enter a first name");
            string fname = Console.ReadLine();
 
            Console.WriteLine("Enter a last name");
            string lname = Console.ReadLine();
 
            var student = new Student()
            {
                FirstName = fname,
                LastName = lname
            };
 
            _students.Add(student);
1
Модератор
Эксперт .NET
10424 / 7400 / 2030
Регистрация: 21.04.2018
Сообщений: 22,326
Записей в блоге: 2
17.11.2018, 20:31 11
Лучший ответ Сообщение было отмечено Iangyl как решение

Решение

Цитата Сообщение от Iangyl Посмотреть сообщение
я много видел, что List рекомендуют, и сначало пытался им сделать, но у меня так и не получилось запихнуть объекты в массив List, спросил у препода - он мне вообще сказал делать через обычные массивы и добавлять э-нты через ф-цию, где я буду переписывать массив, слава богу я нашел Array.Resize и упростил себе задачу, но все же у меня вылетают исключения(см 37 строку)
Немного, хоть себя, делайте удобнее. Что это за класс Class1 ? Назовите Student -понятнее же.

Буду построчно писать исправления и комментарии:

Переделайте Array на list (с учётом изменения названия Class1 - Student)
C#
1
            List<Student> allstudents = new List<Student>();
Объявите одну структуру для записи данных вместо n и Resaze
C#
36
37
                        Student newStudent = new Student(); // n = Checking(temp, n);
                       // Array.Resize(ref allstudents, allstudents.Count() + n);
В строках 40-54, замените allstudents[x] на newStudent и поставьте условие выхода из цикла
C#
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
                        Student newStudent = new Student(); 
                        while(true)
                        {
                            Console.WriteLine("Add information about student ");
                            Console.Write("Enter first name (Empty - Exit): ");
                            newStudent.FirstName = Console.ReadLine();
                            if (string.IsNullOrWhiteSpace(newStudent.FirstName)) break;
                            Console.Write("Enter second name: ");
                            newStudent.SecondName = Console.ReadLine();
                            Console.Write("Enter father name: ");
                            newStudent.FatherName = Console.ReadLine();
                            Console.Write("Enter sex: ");
                            newStudent.sex = Console.ReadLine();
                            Console.Write("Enter course: ");
                            newStudent.course = Convert.ToInt32(Console.ReadLine());
                            Console.Write("Enter group: ");
                            newStudent.FirstName = Console.ReadLine();
                            Console.Write("Enter grade: ");
                            newStudent.group = Console.ReadLine();
                            allstudents.Add(newStudent);
                        }
1
Модератор
Эксперт .NET
10424 / 7400 / 2030
Регистрация: 21.04.2018
Сообщений: 22,326
Записей в блоге: 2
17.11.2018, 20:38 12
Лучший ответ Сообщение было отмечено Iangyl как решение

Решение

Строки 61- 73 вместо цикла for используйте foreach
C#
61
62
63
64
65
66
67
68
69
70
71
72
73
,,                  int numerator = 0;
                    foreach (Student student in allstudents)
                    {
                        numerator++;
                        Console.WriteLine("№" + numerator);
                        Console.WriteLine(student .FirstName);
                        Console.WriteLine(student .SecondName);
                        Console.WriteLine(student .FatherName);
                        Console.WriteLine(student .sex);
                        Console.WriteLine(student .course);
                        Console.WriteLine(student .group);
                        Console.WriteLine(student .grade);
                    }
Добавлено через 2 минуты
Строка 78 использовать метод удаления
C#
78
                    allstudents.RemoveAt(k); // Checking(temp, k);
Добавлено через 1 минуту
Вроде всё.....
1
32 / 34 / 21
Регистрация: 31.03.2018
Сообщений: 472
19.11.2018, 18:21  [ТС] 13
escoult, .Count() разве не сочтёт его как "0"?

Добавлено через 5 минут
Элд Хасп, спасибо, я разобрался в ходе ваших мыслей и каким образом был использован List. Но у меня подчёркнута 36 строка
C#
1
Student newStudent = new Student();
а именно конструктор new Student(), что это может быть? Я пробовал делать некоторые изменения в классе - в акссесорах, а также в конструкторе, но ничего не помогает.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Student
    {
        private string FirstName; //{ get => FirstName; set => FirstName = value; }
        private string SecondName { get; set; }
        private string FatherName { get; set; }
        private string Sex { get; set; }
        private int Course { get; set; }
        private string Group { get; set; }
        private int Grade { get; set; }
 
 
 
        public string firstName { get; set; }
        public string secondName { get; set; }
        public string fatherName { get; set; }
        public string sex { get; set; }
        public int course { get; set; }
        public string group { get; set; }
        public int grade { get; set; }
 
        public Student(string firstName, string secondName, string fatherName, string sex, int course, string group, int grade)
        {
            this.firstName = firstName;
            this.secondName = secondName;
            this.fatherName = fatherName;
            this.sex = sex;
            this.course = course;
            this.group = group;
            this.grade = grade;
        }
 
 
    }
0
Модератор
Эксперт .NET
10424 / 7400 / 2030
Регистрация: 21.04.2018
Сообщений: 22,326
Записей в блоге: 2
19.11.2018, 18:27 14
Цитата Сообщение от Iangyl Посмотреть сообщение
Но у меня подчёркнута 36 строка
В этой строке Вы используете конструктор без параметров. Такой конструктор или объявляется в классе по умолчанию, если не объявлено ни одного кастомного конструктора, или надо объявлять явно. Если Вам такой конструктор не нужен, то не используйте его. Используйте тот который объявлен.
Допустим, так:
C#
36
Student newStudent = new Student("firstName", "secondName", "fatherName", "sex", 3, "group", 5);
1
32 / 34 / 21
Регистрация: 31.03.2018
Сообщений: 472
19.11.2018, 20:38  [ТС] 15
Элд Хасп, спасибо, оно работает.
0
1515 / 413 / 125
Регистрация: 09.01.2018
Сообщений: 890
19.11.2018, 20:44 16
Цитата Сообщение от Iangyl Посмотреть сообщение
.Count() разве не сочтёт его как "0"?
Не сочтет. null это пустая ссылка, объета не существует. Кому считать? Вы получите исключение System.NullReferenceException: 'Object reference not set to an instance of an object.' - ссылка на объкт не указывает на экземпляр объекта.
Разве вы не получили это исключение? О чем тогда вопрос?
0
32 / 34 / 21
Регистрация: 31.03.2018
Сообщений: 472
22.11.2018, 20:49  [ТС] 17
escoult, да получал, я просто вообще не шарю в ошибках, которые выкидывает компилятор(ну разве-что в некоторых).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2018, 20:49

Какой 2D физический движок можно использовать для создания игр
Какой 2D физический движок можно использовать для создания игр. Не обязательно чтобы он...

Можно ли 3D MAX использовать как движок для создания игр?
Некоторые говорят, что можно использовать готовые движки, а подходит ли 3D MAX как движок?

Какой тип использовать для создания рекрсивного массива
Здравствуйте. Не в первый раз встречаюсь с различными задачами в которых очень удобно было бы...

Как программно можно использовать SFX архиватор для создания инсталлятор не таская за собой WinRar?
Здравствуйте. Помогите в решении проблемы! Дело в том, что мне необходимо, чтобы моя программа...

Можно ли использовать темы типа Facebook HTML CMS Templates для создания независимого от соцсети сайта?
Можно ли использовать темы типа Facebook HTML CMS Templates для создания независимого от соцсети...

Какие команды можно использовать в командной строке, для создания и записи образа компакт-диска ISO?
Какие команды можно использовать в командной строке,для создания и записи образа компакт диска ISO?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.