Comment copier des éléments de liste en liste sans foreach?


Réponses:


555

Vous pouvez essayer ceci:

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

ou si vous utilisez C # 3 et .NET 3.5, avec Linq, vous pouvez le faire:

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

14
Si les éléments sont de type MyClassau lieu de Integer, les copient-ils également ou les référencent-ils simplement?
— Pedro Moreira

6
Ne fonctionne pas avec les types non primitifs. List <StudentClass> copy = new List <StudentClass> (lstStudentClass);
— criard

4
Il fonctionne avec tous les types, tant qu'il lstStudentClassest IEnumerable<StudentClass>, il fonctionnera. Si vous ressentez le contraire, vous devez fournir plus d'informations.
— Lasse V. Karlsen

1
quel est le sens de (original); à la fin
— Rahul Chaudhari

1
Vous transmettez une collection au constructeur de la liste, et le constructeur copiera ensuite tous les éléments de cette collection dans la liste nouvellement créée.
— Lasse V. Karlsen

170

Pour ajouter le contenu d'une liste à une autre liste qui existe déjà, vous pouvez utiliser:

targetList.AddRange(sourceList);

Si vous souhaitez simplement créer une nouvelle copie de la liste, consultez la réponse de Lasse.


6
@mrmillsy: Eh bien, ils font des choses différentes. Ma réponse est centrée sur "J'ai déjà une liste, et je veux y copier des choses"
— Jon Skeet

Vrai. Ma question serait probablement mieux adaptée à une nouvelle question de toute façon. Merci pour la réponse.
— mrmillsy

1
Si vous souhaitez remplacer complètement le contenu d'une liste existante, vous devez d'abord appeler targetList.Clear ().
— Ibraheem

33

Pour une liste d'éléments

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 vous souhaitez copier tous les éléments

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

Si vous souhaitez copier les 3 premiers éléments

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

5

Et c'est si la copie d'une seule propriété dans une autre liste est nécessaire:

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

4

Cette méthode créera une copie de votre liste mais votre type doit être sérialisable.

Utilisation:

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

Méthode:

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

La sérialisation crée-t-elle une baisse significative des performances?
— Dan Def

0

OK, cela fonctionne bien D'après les suggestions ci-dessus, GetRange () ne fonctionne pas pour moi avec une liste comme argument ... donc adoucissez un peu les articles ci-dessus: (merci à tous :)

/*  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
Ce n'est même pas une réponse.
— Maciej Jureczko

mmm ... ok et bien certaines des suggestions ci-dessus ne fonctionnent tout simplement pas dans Vis 17 J'ai nettoyé la meilleure réponse fournie ... et bon hop ... ça marche :)
— Jim Stevens

0

Facile à mapper différents ensembles de liste par linq sans boucle

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

Voici une autre méthode mais c'est un peu moins bien comparé aux autres.

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

24
Pourquoi ferais-tu ça? Pourquoi pas ToList()directement?
— nawfal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.