Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 14

При добавлении циклом нескольких элементов student в List у всех у них становится одинаковым поле оценки

06.05.2014, 10:08. Показов 1694. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Помогите пожалуйста, у меня возникла проблема с добавлением элемента в List.
Лист состоит из элементов типа student(Поля student - имя, номер группы, оценки)
При добавлении циклом нескольких элементов student у всех у них становится одинаковым поле оценки, при этом когда я вывожу на экран этот элемент student перед тем как добавить его в лист, то вижу что перед добавлением оценки у всех разные.

У меня 3 файла и 1 текстовый документ: program.cs, MyList.cs, student.cs и List1.txt

program.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
            static void Main(string[] args)
        {
            MyList l1 = new MyList();
            l1.fout();
            Console.ReadKey();
        }
    }
}


MyList.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace ConsoleApplication1
{
    public class MyList : List<student>
    {
        public MyList()
        {
 
        }
 
        public void writes()
        {
            foreach (student s in this)
            {
 
                s.WriteSt();
            }
        }
 
        public void fwrite()
        {
            foreach (student s in this)
            {
 
                StreamWriter sw = new StreamWriter(@"C:\documents\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\List1.txt");
                sw.WriteLine("{0}, {1}, {2} {3} {4} {5} {6}", s.Name, s.Group, s.Sc[0], s.Sc[1], s.Sc[2], s.Sc[3], s.Sc[4]);
                sw.Close();
            }
        }
        public void fout()
        {
                int[] arr = new int[5];
                arr[0] = 0;
                arr[1] = 0;
                arr[2] = 0;
                arr[3] = 0;
                arr[4] = 0;
 
            StreamReader reader = File.OpenText(@"C:\documents\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\List1.txt");
            {
                string line = null;
                do
                {
                    line = reader.ReadLine();
                    if (line != null)
                    {
                        student s = new student("", 0, arr);
                        s = s.ScanSt(line);
                         s.WriteSt();
                        this.Add(s);
                    }
                } while (line != null);
            }
            this.writes();
        }
 
    }
}


student.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    public class student
    {
        private string _name;
        private int _group;
        private int[] _sc = new int[5];
 
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
 
        public int Group
        {
            get { return _group; }
            set { _group = value; }
        }
 
        public int[] Sc
        {
            get { return _sc; }
            set { _sc = value; }
        }
 
 
        public student(string name, int group, int[] sc)
        {
            this._name = name;
            this._group = group;
            this._sc = sc;
        }
 
        public student ScanSt(string st)
        {
            
                int i = 0;
                {
                    while (i <= st.Length)
                    {
                        if (st[i] == ',')
                        {
                            i += 1;
                            break;
                        }
                        else
                        {
                            this._name = this._name + st[i];
                            i += 1;
                        }
                    }
                    string g1 = null;
                    i += 1;
                    while (i <= st.Length)
                    {
                        if (st[i] == ',')
                        {
                            i += 1;
                            break;
                        }
                        else
                        {
                            g1 = g1 + st[i];
                            this._group = Convert.ToInt32(g1);
                            i += 1;
                        }
                    }
 
                    this._sc[0] = Convert.ToInt32(st[i + 1]) - 48;
                    this._sc[1] = Convert.ToInt32(st[i + 3]) - 48;
                    this._sc[2] = Convert.ToInt32(st[i + 5]) - 48;
                    this._sc[3] = Convert.ToInt32(st[i + 7]) - 48;
                    this._sc[4] = Convert.ToInt32(st[i + 9]) - 48;
                
            }
            return this;
        }
 
        public void WriteSt()
        {
            Console.WriteLine("Имя:{0}, Номер группы: {1}, Оценки: {2} {3} {4} {5} {6}", Name, Group, Sc[0], Sc[1], Sc[2], Sc[3], Sc[4]);
        }
 
 
 
    }
}


List1.txt

abcd1, 1231, 4 5 3 5 4
abcd2, 1232, 3 3 3 3 3
abcd3, 1233, 4 4 4 4 4
abcd4, 1234, 5 5 4 4 5
abcd5, 1235, 5 5 5 5 5
abcd6, 1236, 3 4 4 3 4
abcd7, 1237, 4 4 3 4 4
abcd8, 1238, 4 3 4 3 4
abcd9, 1239, 5 4 5 4 5
abcd0, 1230, 5 5 4 5 5


Заранее спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2014, 10:08
Ответы с готовыми решениями:

Создать класс с STUDENT, вывести на экран фамилии и номеров групп для всех студентов, имеющих оценки 4 и 5
Не могу, жизни и смерти, я не понимаю как это сделать, помогите Класс с именем STUDENT, содержащий следующие поля: фамилия и инициалы,...

Автоматически обновить поле в форме при добавлении нового значения в поле со списком
помогите плииииз, у меня форма в ней поля: код(счетчик); фамилия(текст); профессия(подстановка из таблицы &quot;профессия&quot;);...

При потере фокуса поле становится невидимым
Добрый день, нужна помощь, при создании нового товара ( в form2) , поле модель и товар при потере фокуса становятся невидимыми(скрываются),...

10
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.05.2014, 10:14
121victor121, не понял, а зачем у вас MyList наследник List<student>? Не проще в нем создать лист и с ним уже оперировать?
0
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 14
06.05.2014, 10:17  [ТС]
insite2012, Mylist - это list в который я в дальнейшем добавлю некоторые новые методы, как бы расширю его под себя
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.05.2014, 10:21
Цитата Сообщение от 121victor121 Посмотреть сообщение
как бы расширю его под себя
Так и расширяйте. Сделайте в нем обычный private List<T> и с ним оперируйте сколько угодно...
0
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 14
06.05.2014, 10:25  [ТС]
insite2012, а смысл? чем от этого легче станет? да и проблема у меня не в этом
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.05.2014, 10:37
Цитата Сообщение от 121victor121 Посмотреть сообщение
чем от этого легче станет?
121victor121, ну хотя бы более красиво написанным кодом... Разве этого мало?
Вот простой пример. Не знаю ваших целей, поэтому никаких методов не реализовал...
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    public class MyList:IEnumerable<Student>
    {
        private List<Student> myStudents;
        public MyList()
        {
            myStudents = new List<Student>();
        }
 
        public IEnumerator<Student> GetEnumerator()
        {
            return myStudents.GetEnumerator();
        }
 
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return myStudents.GetEnumerator();
        }
    }
    public class Student
    {
        public string Name { get; set; }
        public int Group { get; set; }
        private int[] Sc = new int[5];
 
        public Student(string name)
            : this(name, 0, null) { }
        public Student(string name, int group)
            : this(name, group, null) { }
        public Student(string name,int group,int[] sc)
        {
            Name = name;
            Group = group;
            Sc = sc;
        }
        public override string ToString()
        {
            return string.Format("Имя: {0}; Номер группы: {1}; Оценки: {2}, {3}, {4}, {5}, {6}",
                                  Name, Group, Sc[0], Sc[1], Sc[2], Sc[3], Sc[4]);
        }
    }
}
0
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 14
06.05.2014, 10:40  [ТС]
insite2012, Ну это для меня в данный момент не самое важное) Мне бы проблему эту решить с оценками ...
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.05.2014, 10:42
Цитата Сообщение от 121victor121 Посмотреть сообщение
Мне бы проблему эту решить с оценками ...
К сожалению, четкой проблемы вы не озвучили... Как и самой задачи... Что требуется? Считать данные из файла и заполнить ими лист со студентами?
0
0 / 0 / 0
Регистрация: 30.04.2014
Сообщений: 14
06.05.2014, 10:45  [ТС]
insite2012, я считываю данные из файла( они считываются нормально так как перед тем как занести студента в лист я вывожу его на экран и проверяю) но после того как я заношу их в лист у них у всех становятся одинаковые оценки( с именами и номерами группы все в порядке) оценки у всех как оценки последнего элемента
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.05.2014, 10:59
121victor121, хорошо, так уже понятнее.

Добавлено через 10 минут
121victor121, вот... Все считывается и заполняется корректно... Проверяйте.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyList myStudents = new MyList();
            myStudents.FillList();
            foreach (Student st in myStudents)
            {
                Console.WriteLine(st.ToString());
            }
            Console.ReadLine();
        }
    }
    public class MyList:IEnumerable<Student>
    {
        private List<Student> myStudents;
        public MyList()
        {
            myStudents = new List<Student>();
        }
 
        public void FillList()
        {
            using (StreamReader sr = File.OpenText(@"C:\myList.txt"))
            {
                while (sr.Peek() != -1)
                {
                    string[] temp = sr.ReadLine().Split(new char[]{','});
                    string[] sc = temp[2].Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries);
                    int[] intSc = (from n in sc select int.Parse(n)).ToArray();
                    myStudents.Add(new Student(temp[0], int.Parse(temp[1]), intSc));
                }
            }
        }
        public IEnumerator<Student> GetEnumerator()
        {
            return myStudents.GetEnumerator();
        }
 
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return myStudents.GetEnumerator();
        }
    }
    public class Student
    {
        public string Name { get; set; }
        public int Group { get; set; }
        private int[] Sc = new int[5];
 
        public Student(string name,int group,int[] sc)
        {
            Name = name;
            Group = group;
            Sc = sc;
        }
        public override string ToString()
        {
            return string.Format("Имя: {0}; Номер группы: {1}; Оценки: {2}, {3}, {4}, {5}, {6}",
                                  Name, Group, Sc[0], Sc[1], Sc[2], Sc[3], Sc[4]);
        }
    }
}
0
1168 / 886 / 517
Регистрация: 09.04.2014
Сообщений: 2,101
06.05.2014, 11:57
Цитата Сообщение от 121victor121 Посмотреть сообщение
у всех у них становится одинаковым поле оценки
Проблема в том, что Вы создавая елементы типа student в MyList.fout передаете в конструктор тот же массив int[], а точнее ссылку на него, в результате все элементы имеют ссылку на тот же массив оценок. Соответственно изменяя оценки для одного элемента Вы изменяете их для всех одновременно.
Выход:
1. MyList.fout создавать int[] arr внутри цикла (для каждого элемента отдельно)
или
2. в конструкторе класса student создавать копию массива int[] sc и полю _sc присваивать уже эту копию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.05.2014, 11:57
Помогаю со студенческими работами здесь

что нужно сделать чтобы при добавлении товара с одинаковым названием не добавлялась новая запись, а просто сумировалось количество?
у меня есть таблица |группа товара|подгруппа товара|товар|количество|цена| что нужно сделать чтобы при добавлении товара с одинаковым...

Выделение памяти при добавлении в List<T>
есть список List&lt;string&gt; _allValue; добавляю элемент в этот список. _allValue = new List&lt;string&gt; { }; ...

Создание нескольких элементов одним циклом
Доброго времени суток всем! Есть задание у меня. Под каждое изображение на странице сайта надо добавить кнопку, которая бы позволяла...

Ошибка при добавлении элемента в коллекцию List<T>
Добрый день! Возникла такая проблема. Есть класс class Node { //в нем есть свойство Nodes, //которое реализует...

Сумма всех элементов с одинаковым ид точки
Есть запрос SELECT `id_tochka`,`id_tovar`,sum(`kolich`*`cena`) FROM `prihod` WHERE `id_tovar`=`id_tovar` AND `id_tochka`=1 по идее он...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru