Làm cách nào để sao chép các mục từ danh sách này sang danh sách khác mà không cần thông báo?


Câu trả lời:


554

Bạn có thể thử điều này:

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

hoặc nếu bạn đang sử dụng C # 3 và .NET 3.5, với Linq, bạn có thể làm điều này:

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

14
Nếu các mặt hàng là loại MyClassthay vì Integer, nó cũng sao chép các mặt hàng, hoặc chỉ tham khảo chúng?
Pedro Moreira

6
Không làm việc với các loại Không nguyên thủy. Danh sách <StudentClass> sao chép = Danh sách mới <StudentClass> (lstStudentClass);
garish

4
Nó hoạt động với tất cả các loại, miễn lstStudentClassIEnumerable<StudentClass>nó sẽ hoạt động. Nếu bạn có kinh nghiệm khác, bạn cần cung cấp thêm thông tin.
Lasse V. Karlsen

1
ý nghĩa của (bản gốc) là gì; vào cuối
Rahul Chaudhari

1
Bạn chuyển một bộ sưu tập cho hàm tạo của danh sách và sau đó hàm tạo sẽ sao chép tất cả các phần tử của bộ sưu tập đó vào danh sách mới được tạo.
Lasse V. Karlsen

170

Để thêm nội dung của một danh sách vào danh sách khác đã tồn tại, bạn có thể sử dụng:

targetList.AddRange(sourceList);

Nếu bạn chỉ muốn tạo một bản sao mới của danh sách, hãy xem câu trả lời của Lasse.


6
@mrmillsy: Vâng, họ làm những việc khác nhau. Câu trả lời của tôi tập trung vào "Tôi đã có một danh sách và tôi muốn sao chép mọi thứ vào đó"
Jon Skeet

Thật. Câu hỏi của tôi có lẽ sẽ phù hợp hơn với một câu hỏi mới. Cảm ơn vì lời đáp sâu sắc.
mrmillsy

1
Nếu bạn muốn thay thế hoàn toàn nội dung của một danh sách hiện có, trước tiên bạn sẽ gọi targetList.Clear ().
Ibraheem

33

Để biết danh sách các yếu tố

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

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

Nếu bạn muốn sao chép tất cả các yếu tố

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

Nếu bạn muốn sao chép 3 yếu tố đầu tiên

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

5

Và đây là nếu sao chép một thuộc tính duy nhất vào danh sách khác là cần thiết:

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

4

Phương pháp này sẽ tạo một bản sao của danh sách của bạn nhưng loại của bạn nên được tuần tự hóa.

Sử dụng:

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

Phương pháp:

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;
    }

Liệu tuần tự hóa tạo ra một hình phạt hiệu suất đáng kể?
Dan Def

0

OK, điều này đang hoạt động tốt

/*  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
Đây thậm chí không phải là một câu trả lời.
Maciej Jureczko

mmm ... ok, một số gợi ý ở trên chỉ đơn giản là không hoạt động trong Vis 17 Tôi đã làm sạch câu trả lời tốt nhất được cung cấp ... và xin chào ... nó hoạt động :)
Jim Stevens

0

Dễ dàng ánh xạ tập hợp danh sách khác nhau theo linq mà không cần vòng lặp

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

Ở đây phương pháp khác nhưng nó kém hơn một chút so với phương pháp khác.

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

24
Tại sao bạn lại làm vậy? Tại sao không ToList()trực tiếp?
nawfal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.