С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/324: Рейтинг темы: голосов - 324, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 04.05.2010
Сообщений: 112
1

Копировать List

14.05.2010, 11:03. Показов 66036. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как один List можно скопировать в другой ,не перебирая при этом в цикле элементы 1го и вставляя их во 2й.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2010, 11:03
Ответы с готовыми решениями:

Копировать ReadOnlyCollection to List или Array
Доброго времени суток. Нужно скопировать информацию из ReadOnlyCollection в List или Array. Но...

Как копировать элементы из одного массива List<> в другой?
Я пробую так но выдает ошибку. void Deleta_Cubic(int nomer) { for...

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например,...

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из ...

20
31 / 31 / 6
Регистрация: 31.12.2009
Сообщений: 82
14.05.2010, 14:36 2
ммм ... присвоить один второму?
0
0 / 0 / 1
Регистрация: 04.05.2010
Сообщений: 112
14.05.2010, 14:59  [ТС] 3
Цитата Сообщение от mitsky Посмотреть сообщение
ммм ... присвоить один второму?
Это получается не скопировать а присвоить указатель другого.А я спрашиваю как содержимое памяти из одного скопировать в другой!
0
31 / 31 / 6
Регистрация: 31.12.2009
Сообщений: 82
14.05.2010, 15:26 4
C#
1
2
3
4
5
6
7
8
9
10
11
    List<string> lst1 = new List<string>();
    List<string> lst2 = new List<string>();
    lst1.Add("0");
    lst1.Add("1");
    lst1.Add("2");
    lst1.Add("3");
 
    lst1.ForEach(delegate(string s)
    {
        lst2.Add(s);
    });
может так?
или так ...
C#
1
    lst2 = lst1.GetRange(0, lst1.Count);
0
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
14.05.2010, 17:00 5
метод GetRange() самый оптимальный способ
0
24 / 24 / 1
Регистрация: 25.12.2009
Сообщений: 86
09.06.2010, 10:09 6
Не знаю, у меня GetRange не пошёл, в смысле скопировать, скопировал, но при изменении одного, меняется и другой. В общем эффект такой же, как если просто присвоить один объект другому.
0
I ♥ C#
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
09.06.2010, 11:42 7
Не знаю, у меня GetRange не пошёл, в смысле скопировать, скопировал, но при изменении одного, меняется и другой. В общем эффект такой же, как если просто присвоить один объект другому.
Странно. Вы уже где-то задавали похожий вопрос и я посоветовал передавать в конструктор списка, тот список, на основе которого вы хотите создать новый. У вас он тоже не работал, в то время как у меня все впорядке. Вот пример кода и вывод на консоль. У вас разве не так?

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
using System;
using System.Collections.Generic;
 
class TMain
{
    static void Main()
    {
        List<string> FirstList = new List<string>();
        FirstList.Add("тили");
        FirstList.Add("вили");
        FirstList.Add("трали");
        FirstList.Add("вали");
        int i;
        Console.WriteLine("Исходное содержимое FirstList:");
        for(i= 0; i < FirstList.Count; i++)
            Console.WriteLine(FirstList[i]);
        Console.WriteLine();
 
        List<string> SecondList = new List<string>(FirstList); //пихаем в конструктор первый список
        Console.WriteLine("Скопированное содержимое в SecondList:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(SecondList[i]);
        Console.WriteLine();
 
        Console.WriteLine("Заменим FirstList[2] на \"оли\", а FirstList[3] на \"моли\"");
        FirstList[2] = "оли";
        FirstList[3] = "моли";
        Console.WriteLine("Проверим, изменился ли SecondList:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(SecondList[i]);
        Console.WriteLine();
 
        Console.WriteLine("Ну а FirstList, разумеется, изменился:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(FirstList[i]);
        Console.ReadKey();
    }
}
Миниатюры
Копировать List  
2
24 / 24 / 1
Регистрация: 25.12.2009
Сообщений: 86
09.06.2010, 13:04 8
Да, спрашивал, но мне кажется , что дело в том, что тут мы используем список из стандартных типов, а там из объектов собственного класса, где необходима перегрузка оператора присваивания. Т.к. этот пример работает, а мой - нет
0
I ♥ C#
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
09.06.2010, 15:19 9
Насколько мне известно оператор присваивания нельзя перегружать. Вариант со списком содержащим элементы какого-то класса тоже работает вполне ожидаемо:
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
using System;
using System.Collections.Generic;
 
class MyClass
{
    public int a;
 
    public MyClass(int InA)
    {
        a = InA;
    }
 
    public override string ToString()
    {
        return a.ToString();
    }
}
 
class TMain
{
    static void Main()
    {
        List<MyClass> FirstList = new List<MyClass>();
        MyClass x = new MyClass(1);
        MyClass y = new MyClass(2);
        MyClass z = new MyClass(3);
        FirstList.Add(x);
        FirstList.Add(y);
        FirstList.Add(z);
 
        int i;
        Console.WriteLine("Исходное содержимое FirstList:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(FirstList[i]);
        Console.WriteLine();
 
        List<MyClass> SecondList = new List<MyClass>(FirstList); //пихаем в конструктор первый список
        Console.WriteLine("Скопированное содержимое в SecondList:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(SecondList[i]);
        Console.WriteLine();
 
        Console.WriteLine("Создадим новый объект MyClass(4) и запишем ссылку на него в FirstList[2]");
        FirstList[2] = new MyClass(456);
 
        Console.WriteLine("Проверим, изменился ли SecondList:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(SecondList[i]);
        Console.WriteLine();
 
        Console.WriteLine("Ну а FirstList, разумеется, изменился:");
        for (i = 0; i < FirstList.Count; i++)
            Console.WriteLine(FirstList[i]);
        Console.ReadKey();
    }
}
Хотя, пожалуй, тут стоит обратить внимание на то, что если, например, изменить объект x, то это изменение вы увидите в обоих списках, потому что списки содержат ссылки, и изменять независимо вы можете только ссылки, именно поэтому мой пример отработал ожидаемо, т.к. я создал новый объект и записал на него ссылку: FirstList[2] = new MyClass(456);
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
09.06.2010, 15:52 10
это уже вопрос по копированию самого объекта класса, для этого можно сделать отдельный конструктор копии(принимает объект этого же класса) или какой-то статический метод на крайняк

где-то в другой теме предложили вариант - сериализация, самый короткий и надежный способ как ни странно
0
24 / 24 / 1
Регистрация: 25.12.2009
Сообщений: 86
09.06.2010, 20:37 11
Цитата Сообщение от m0nax Посмотреть сообщение
это уже вопрос по копированию самого объекта класса, для этого можно сделать отдельный конструктор копии(принимает объект этого же класса) или какой-то статический метод на крайняк
Я так и сделал
А можно поподробнее про сериализацию
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
09.06.2010, 21:25 12
Цитата Сообщение от Alex_C# Посмотреть сообщение
А можно поподробнее про сериализацию
в конце темы пост Копирование объекта List<>
0
-10 / 2 / 0
Регистрация: 11.11.2014
Сообщений: 22
11.11.2014, 09:41 13
Ох мальчишки не нужно сериализации. Гуру Валера изрек истину и я быстро записал за ним.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            List<string> lst1 = new List<string>();
            lst1.Add("0");
            lst1.Add("1");
            lst1.Add("2");
            lst1.Add("3");
 
            List<string> lst2 = new List<string>();
            lst2.Add("111");
            lst2.Add("222");
            lst2.Add("333");
//если нужно сохранить прежнее содержимое  lst1 добавив в конец его содержимое lst2
            lst1.AddRange(lst2);
//или так если нужно заполнить только эелементами второго списка
            lst1.Clear();
            lst1.AddRange(lst2);
0
4 / 4 / 0
Регистрация: 22.11.2015
Сообщений: 1
23.11.2015, 00:02 14
Все гораздо проще, а вы тут мутите
C#
1
2
3
4
5
List<string> a = new List<string>();
a.Add("op");
a.Add("pa");
a.Add("pam!");
List<string> b = new List<string>(a);
Ну а если добавить надо, то AddRange()
4
1051 / 330 / 119
Регистрация: 28.11.2020
Сообщений: 1,054
04.11.2022, 07:59 15
Цитата Сообщение от mitsky Посмотреть сообщение
lst1.ForEach(delegate(string s)
    {
        lst2.Add(s);
    });
Достаточно сделать так...
C#
1
lst1.ForEach (e => lst2.Add (e));
0
Администратор
Эксперт .NET
17709 / 13836 / 5313
Регистрация: 17.03.2014
Сообщений: 28,343
Записей в блоге: 1
04.11.2022, 08:37 16
Doomov, улучшение плохого решения пустая трата времени.
0
-10 / 2 / 0
Регистрация: 11.11.2014
Сообщений: 22
04.11.2022, 09:11 17
12 лет прошло. по сабжу нет замечаний, кроме того, что я все еще жив. Ну и еще пожалуй что спустя эти 12 лет шарп как и прежде плетется в хвосте других джавопитонов и как прежде красив и бесполезен для зарабатывания денег, по крайней мере в наших краях. будите еще через 12..
0
1051 / 330 / 119
Регистрация: 28.11.2020
Сообщений: 1,054
04.11.2022, 11:07 18
OwenGlendower, ?
как был задан вопрос, таков и ответ.
А то что вы имели ввиду, там намного проще, что вы предложили.
Но за твой "наезд" ответ не выкладывать не буду. И следи за словами админ!
0
Администратор
Эксперт .NET
17709 / 13836 / 5313
Регистрация: 17.03.2014
Сообщений: 28,343
Записей в блоге: 1
04.11.2022, 12:33 19
Цитата Сообщение от Doomov Посмотреть сообщение
?
В теме привели нормальные решения - конструктор или AddRange. ForEach для этой задачи не нужен. Мы зря тратим память на делегат и замыкание. Не говоря уже о ненужных промежуточных выделениях памяти при вызовах List<T>.Add().

Цитата Сообщение от Doomov Посмотреть сообщение
Но за твой "наезд" ответ не выкладывать не буду.
Детский сад.
0
Dr9vik
04.11.2022, 12:41     Копировать List
  #20

Не по теме:

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

детский садик...

0
04.11.2022, 12:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2022, 12:41
Помогаю со студенческими работами здесь

Необходимо создать dll в которой буду обрабатывать list<list<string>>
Необходимо создать dll в которой буду обрабатывать list&lt;list&lt;string&gt;&gt; как объявить методы класса...

Как узнать размерность внутреннего вектора в массиве List<List<Double>>?
Добрый вечер! Уважаемые, подскажите пожалуйста, как узнать размерность внутренних строк в...

Добавление строк и элементов в коллекцию для коллекций <List<List<T>
Доброго времени суток , никак не могу добавить строку в коллекцию коллекций . У меня нет...

Найти минимальный элемент List<List<int?>>, не используя циклов
Имеется List&lt;List&lt;int?&gt;&gt; matrix = new List&lt;List&lt;int?&gt;&gt;(); список. Есть ли возможность найти...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru