Jak skopiować elementy z listy do listy bez uprzedzenia?

318

Jak przenieść elementy zawarte w jednym Listw drugim w C # bez użycia foreach?

roziskrzony
źródło
3
Jeśli potrzebujesz głębokiego klonowania oryginalnej listy, znajdziesz odpowiedź na to powiązane pytanie: stackoverflow.com/questions/222598/…
Dirk Vollmar,

Odpowiedzi:

554

Możesz spróbować:

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

lub jeśli używasz C # 3 i .NET 3.5, z Linq, możesz to zrobić:

List<Int32> copy = original.ToList();
Lasse V. Karlsen
źródło
14
Jeśli elementy są typu MyClasszamiast Integer, to czy kopiuje je również, czy tylko je odwołuje?
Pedro Moreira,
5
Nie działa z nietypowymi typami. List <StudentClass> copy = new List <StudentClass> (lstStudentClass);
krzykliwy
4
Działa ze wszystkimi typami, tak długo jak lstStudentClassjest IEnumerable<StudentClass>, będzie działać. W przeciwnym razie musisz podać więcej informacji.
Lasse V. Karlsen
1
jakie jest znaczenie (oryginalne); na koniec
Rahul Chaudhari,
1
Przekazujesz kolekcję konstruktorowi listy, a następnie konstruktor skopiuje wszystkie elementy tej kolekcji do nowo utworzonej listy.
Lasse V. Karlsen,
170

Aby dodać zawartość jednej listy do innej, która już istnieje, możesz użyć:

targetList.AddRange(sourceList);

Jeśli chcesz tylko utworzyć nową kopię listy, zobacz odpowiedź Lasse.

Jon Skeet
źródło
6
@mrmillsy: Cóż, robią różne rzeczy. Moja odpowiedź koncentruje się na: „Mam już listę i chcę na nią skopiować”
Jon Skeet
Prawdziwe. Moje pytanie i tak prawdopodobnie lepiej pasuje do nowego pytania. Dziękuję za odpowiedź.
mrmillsy
1
Jeśli chcesz całkowicie zastąpić zawartość istniejącej listy, najpierw wywołaj targetList.Clear ().
Ibraheem,
33

Aby uzyskać listę elementów

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

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

Jeśli chcesz skopiować wszystkie elementy

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

Jeśli chcesz skopiować pierwsze 3 elementy

List<string> lstNew = lstTest.GetRange(0, 3);
Paras
źródło
5

Dzieje się tak, jeśli konieczne jest skopiowanie jednej właściwości na inną listę:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));
przydatne
źródło
4

Ta metoda utworzy kopię listy, ale typ powinien być możliwy do serializacji.

Posługiwać się:

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

Metoda:

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;
    }
krzykliwy
źródło
Czy serializacja powoduje znaczny spadek wydajności?
Dan Def
0

OK, to działa dobrze Z powyższych sugestii GetRange () nie działa dla mnie z listą jako argumentem ... więc trochę osłabiając nieco z postów powyżej: (dziękuję wszystkim :)

/*  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 );
}
Jim Stevens
źródło
2
To nawet nie jest odpowiedź.
Maciej Jureczko
mmm ... ok cóż, niektóre powyższe sugestie po prostu nie działają w Vis 17 Wyczyściłem najlepszą odpowiedź pod warunkiem ... i hej presto ... to działa :)
Jim Stevens
0

Łatwo zmapować inny zestaw list według linq bez pętli

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();
Rajeev
źródło
-9

Tutaj inna metoda, ale jest niewiele gorsza w porównaniu do innych.

List<int> i=original.Take(original.count).ToList();
roziskrzony
źródło
24
Dlaczego chcesz to zrobić? Dlaczego nie ToList()bezpośrednio?
nawfal