¿Cómo copio elementos de una lista a otra sin foreach?

Respuestas:

555

Podrías probar esto:

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

o si está usando C # 3 y .NET 3.5, con Linq, puede hacer esto:

List<Int32> copy = original.ToList();
Lasse V. Karlsen
fuente
14
Si los elementos son de tipo en MyClasslugar de Integer, ¿los copia también, o simplemente los referencia?
Pedro Moreira
66
No funciona con tipos no primitivos. List <StudentClass> copy = new List <StudentClass> (lstStudentClass);
llamativo
44
Funciona con todos los tipos, siempre que lstStudentClasssea IEnumerable<StudentClass>y funcionará. Si experimenta lo contrario, debe proporcionar más información.
Lasse V. Karlsen
1
cuál es el significado de (original); al final
Rahul Chaudhari
1
Usted pasa una colección al constructor de la lista, y el constructor copiará todos los elementos de esa colección en la lista recién creada.
Lasse V. Karlsen
170

Para agregar el contenido de una lista a otra lista que ya existe, puede usar:

targetList.AddRange(sourceList);

Si solo desea crear una nueva copia de la lista, consulte la respuesta de Lasse.

Jon Skeet
fuente
66
@mrmillsy: Bueno, ellos hacen cosas diferentes. Mi respuesta se centra en "Ya tengo una lista y quiero copiar cosas"
Jon Skeet
Cierto. Mi pregunta probablemente sería más adecuada para una nueva pregunta de todos modos. Gracias por la respuesta sin embargo.
mrmillsy
1
Si desea reemplazar por completo el contenido de una lista existente, primero debe llamar a targetList.Clear ().
Ibraheem
33

Para una lista de elementos

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

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

Si quieres copiar todos los elementos

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

Si quieres copiar los primeros 3 elementos

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

Y esto es si se necesita copiar una sola propiedad a otra lista:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));
útilBee
fuente
4

Este método creará una copia de su lista, pero su tipo debe ser serializable.

Utilizar:

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

Método:

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;
    }
llamativo
fuente
¿La serialización crea una penalización de rendimiento significativa?
Dan Def
0

OK, esto está funcionando bien De las sugerencias anteriores GetRange () no funciona para mí con una lista como argumento ... por lo que endulzar un poco las publicaciones anteriores: (gracias a todos :)

/*  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
fuente
2
Esto ni siquiera es una respuesta.
Maciej Jureczko
mmm ... bueno, algunas de las sugerencias anteriores simplemente no funcionan en Vis 17 He limpiado la mejor respuesta proporcionada ... y bueno, listo ... funciona :)
Jim Stevens
0

Fácil de mapear diferentes conjuntos de listas por linq sin for loop

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
fuente
-9

Aquí otro método pero es un poco peor en comparación con otro.

List<int> i=original.Take(original.count).ToList();
andrajoso
fuente
24
¿Por qué harías eso? ¿Por qué no ToList()directamente?
nawfal