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

Переменная ArrayList

04.12.2019, 23:37. Показов 1971. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Столкнулся со следующей проблемой:

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

Каким образом можно это исправить? Чтобы была возможность сохранить arraylist в пределах программы для повторного использования.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.12.2019, 23:37
Ответы с готовыми решениями:

В классе Use объявить ArrayList и добавить в каждый элемент ArrayList ID, Name, Text, Song
народ помогите есть класс Card и класс Use, код бросил, namespace KURSOVA { class Card { public string Name {...

ArrayList: необработанное исключение. Операции над множествами с использованием ArrayList
Задача: разработать калькулятор для логических множеств ( для операций пересечение, объединение, разность и симметричная разность). Сделано...

Не удается присвоить значение члену переменная "in Some", так как это переменная только для чтения
namespace CSrharpApplicationTest { public struct Some { public int x; } public class Program {...

9
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
04.12.2019, 23:54
1. Старайтесь не пользоваться ArrayList, используйте типизированный List.
2. Почитайте о разнице Value types vs Reference types - найдете ответ на вопрос, почему у вас поменялось значение.
3. Создайте новый объект(ы) на основе существующего, например так var myobj2 = new MyClass(myobj1). Внутри конструктора скопируйте данные из исходного объекта
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.12.2019, 07:34
tltrus, мудрите вы что-то....
Лучше опишите задачу в целом, чем способ вашей реализации.
0
1 / 1 / 1
Регистрация: 06.09.2018
Сообщений: 29
05.12.2019, 07:35  [ТС]
Спасибо за ответ.
Уточните, пожалуйста, про 3-й пункт. Я попробовал его реализовать, но что то делаю не так.

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
    class Program
    {
        static void Main(string[] args)
        {
            A object1 = new A();
            B object2 = new B(object1.Data); // внутри object2 находится 3 элемента
 
            object1.change();
            var test = object2; // внутри test находится 5 элементов
        }
    }
 
    class A
    {
        public ArrayList Data = new ArrayList();
        public A()
        {
            this.Data.Add(1);
            this.Data.Add(2);
            this.Data.Add(3);
        }
 
        public void change()
        {
            Data.Add(4);
            Data.Add(5);
        }
    }
 
    class B
    {
        public ArrayList Data;
        public B(ArrayList a)
        {
            Data = a;
        }
 
    }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.12.2019, 08:02
tltrus, в C# есть значимые и ссылочные типы.
К ссылочным там относятся классы.
К значимым структуры.
При присвании переменной значимого типа ей присваивается значение.
Ссылочного - ссылка на объект. Поэтому изменяя состояние объекта ссылочного типа, то все переменные хранящие ссылку на этот объект будут возвращать этот измененный объект.

Для понимания проведите тест с такими классами и структурам
C#
1
2
3
4
5
6
7
8
public class CustomClass
{
     public int Value;
}
public struct CustomStruct
{
     public int Value;
}
Тестовый код
C#
1
2
3
4
5
6
7
8
9
CustomClass clA = new CustomClass() {Value=5};
CustomClass clB = clA;
clA.Value = 20;
Console.WriteLine($"clA={clA.Value} | clB={clB.Value}");
 
CustomStruct strA = new CustomStruct() {Value=5};
CustomStruct strB = strA;
strA.Value = 20;
Console.WriteLine($"strA={strA.Value} | strB={strB.Value}");
0
1 / 1 / 1
Регистрация: 06.09.2018
Сообщений: 29
05.12.2019, 08:11  [ТС]
Спасибо за пример. Наглядно и доходчиво.

Но как же быть в ситуации, если нужно использовать ранее инициализированный arraylist несколько раз в программе?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.12.2019, 08:27
tltrus, во первых, ArrayList это базовый тип и не рекомендуется его использовать.
Вместо него надо использовать List<T>.
Для целых чисел это будет List<int>, для любых типов List<object>

Получить копию списка можно разными способами.
Один из них использование метода расширения ToList().
C#
1
2
3
4
5
6
7
List<int> listA = new List<int>() {1,2,3};
List<int> listB = listA.ToList();
listA.Add(4);
listA.Add(5);
 
Console.WriteLine(string.Join(",", listA);
Console.WriteLine(string.Join(",", listB);
0
1 / 1 / 1
Регистрация: 06.09.2018
Сообщений: 29
05.12.2019, 08:28  [ТС]
Спасибо большое. Пойду курить то, что Вы написали.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
05.12.2019, 08:54
Лучший ответ Сообщение было отмечено tltrus как решение

Решение

tltrus, можно и перегрузкой конструктора воспользоваться
C#
1
2
3
4
5
6
7
List<int> listA = new List<int>() {1,2,3};
List<int> listB = new List<int>(listA);
listA.Add(4);
listA.Add(5);
 
Console.WriteLine(string.Join(", ", listA));
Console.WriteLine(string.Join(", ", listB));
Добавлено через 4 минуты
tltrus, можно "отремонтировать" ваш код, но не советую так делать.
Только в случае если в задании прямо указано об использовании ArrayList
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
    class Program
    {
        static void Main(string[] args)
        {
            A object1 = new A();
            B object2 = new B(object1.Data); // внутри object2 находится 3 элемента
 
            object1.change();
            var test = object2; // внутри test находится 5 элементов
        }
    }
 
    class A
    {
        public ArrayList Data = new ArrayList();
        public A()
        {
            this.Data.Add(1);
            this.Data.Add(2);
            this.Data.Add(3);
        }
 
        public void change()
        {
            Data.Add(4);
            Data.Add(5);
        }
    }
 
    class B
    {
        public ArrayList Data;
        public B(ArrayList a)
        {
            Data = new ArrayList(a);
        }
 
    }
1
1 / 1 / 1
Регистрация: 06.09.2018
Сообщений: 29
05.12.2019, 09:17  [ТС]
Еще раз спасибо.
Я адаптирую чужой код генетического алгоритма под свои нужды. Изучаю ГА и параллельно осваиваю C#.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2019, 09:17
Помогаю со студенческими работами здесь

Конструкция "условие-знак вопроса-переменная-двоеточие-переменная"
Доброго времени суток. Возник вопрос на который оказалось проблематично подобрать критерий поиска. Как работает данная конструкция: ...

ArrayList.Contains
Добрый день. Есть две коллекции типа ArrayList. Первая коллекция (word) хранит элементы: the the english Вторая...

ArrayList
Обььясните, пожалуйста, разницу между count i capacity в ArrayList Т.е. есть АrrayList t= new ArrayList() //как-то там заполняется...

ArrayList и индексатор
public class Dictionary { private ArrayList dictionary = new ArrayList(); public void Add(string eng, string...

Вывод из ArrayList
Необходимо вывести из ArrayList объекты разных типов.Получается выводить только одного типа.При попытке вывода нескольких выводит ошибку...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru