Як скопіювати елементи зі списку до списку без виступу?


318

Як я можу передати елементи, що містяться один Listв інший в C #, не використовуючи foreach?


3
Якщо вам потрібен глибокий клон вихідного списку ви знайдете відповідь у цьому пов'язаний з цим питання: stackoverflow.com/questions/222598 / ...
Dirk Фольмар

Відповіді:


554

Ви можете спробувати це:

List<Int32> copy = new List<Int32>(original);

або якщо ви використовуєте C # 3 та .NET 3.5, за допомогою Linq ви можете це зробити:

List<Int32> copy = original.ToList();

14
Якщо елементи MyClassзамість них є типовими Integer, чи копіює вони їх, чи просто посилається на них?
Педро Морейра

5
Не працює з непомітивними типами. Список <StudentClass> копія = новий Список <StudentClass> (lstStudentClass);
Гаріш

4
Він працює з усіма типами, доки lstStudentClassвін є IEnumerable<StudentClass>, він буде працювати. Якщо у вас виникне інше, вам потрібно надати більше інформації.
Лассе В. Карлсен

1
яке значення (оригінал); наприкінці
Рахул Чаудхарі

1
Ви передаєте колекцію конструктору списку, а потім конструктор скопіює всі елементи цієї колекції у новостворений список.
Лассе В. Карлсен

170

Щоб додати вміст одного списку до іншого, який вже існує, ви можете використовувати:

targetList.AddRange(sourceList);

Якщо ви просто хочете створити нову копію списку, дивіться відповідь Лассе.


6
@mrmillsy: Ну вони роблять різні речі. Моя відповідь зосереджена на "У мене вже є список, і я хочу скопіювати його"
Джон Скіт

Правда. Моє питання, мабуть, краще підійде до нового питання. Дякую за відповідь, хоча.
mrmillsy

1
Якщо ви хочете повністю замінити вміст наявного списку, спершу зателефонуйте targetList.Clear ().
Ібрагіем

33

Для переліку елементів

List<string> lstTest = new List<string>();

lstTest.Add("test1");
lstTest.Add("test2");
lstTest.Add("test3");
lstTest.Add("test4");
lstTest.Add("test5");
lstTest.Add("test6");

Якщо ви хочете скопіювати всі елементи

List<string> lstNew = new List<string>();
lstNew.AddRange(lstTest);

Якщо ви хочете скопіювати перші 3 елементи

List<string> lstNew = lstTest.GetRange(0, 3);

5

І це якщо потрібно скопіювати одну властивість до іншого списку:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));

4

Цей метод створить копію вашого списку, але ваш тип має бути серійним.

Використання:

List<Student> lstStudent = db.Students.Where(s => s.DOB < DateTime.Now).ToList().CopyList(); 

Спосіб:

public static List<T> CopyList<T>(this List<T> lst)
    {
        List<T> lstCopy = new List<T>();
        foreach (var item in lst)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, item);
                stream.Position = 0;
                lstCopy.Add((T)formatter.Deserialize(stream));
            }
        }
        return lstCopy;
    }

Чи створює серіалізація суттєве покарання за ефективність?
Дан Деф

0

Гаразд, це працює добре. З пропозицій, наведених вище, GetRange () не працює для мене зі списком як аргумент ... тож підсолодивши речі трохи вище від публікацій: (дякую всім :)

/*  Where __strBuf is a string list used as a dumping ground for data  */
public List < string > pullStrLst( )
{
    List < string > lst;

    lst = __strBuf.GetRange( 0, __strBuf.Count );     

    __strBuf.Clear( );

    return( lst );
}

2
Це навіть не відповідь.
Мацей Юречко

ммм ... гаразд, деякі з пропозицій вище просто не працюють у Vis 17. Я прибрав найкращу відповідь, що надається ... і ей престо ... це працює :)
Джим Стівенс

0

Легко зіставити різні набори списку по linq без циклу

var List1= new List<Entities1>();

var List2= new List<Entities2>();

var List2 = List1.Select(p => new Entities2
        {
            EntityCode = p.EntityCode,
            EntityId = p.EntityId,
            EntityName = p.EntityName
        }).ToList();

-9

Тут інший метод, але він трохи гірший порівняно з іншими.

List<int> i=original.Take(original.count).ToList();

24
Навіщо ти це робив? Чому б не ToList()прямо?
nawfal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.