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.