346 votes

Comment copier des éléments d'une liste à une autre sans foreach ?

Comment transférer les éléments contenus dans un List à un autre en C# sans utiliser foreach ?

3 votes

Si vous avez besoin d'un clone profond de la liste originale, vous trouverez la réponse dans cette question connexe : stackoverflow.com/questions/222598/

607voto

Lasse V. Karlsen Points 148037

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 faire ceci :

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

Je vois que cette réponse reçoit encore des votes positifs. Eh bien, voici un secret pour toi : la réponse ci-dessus utilise toujours un foreach . S'il vous plaît ne pas upvote ce plus loin.

20 votes

Si les éléments sont de type MyClass au lieu de Integer Est-ce qu'il copie aussi les éléments, ou est-ce qu'il les référence simplement ?

7 votes

Ne fonctionne pas avec les types non primitifs. List<StudentClass> copy = nouvelle List<StudentClass>(lstStudentClass) ;

4 votes

Il fonctionne avec tous les types, à condition que lstStudentClass est un IEnumerable<StudentClass> il fonctionnera. Si vous rencontrez d'autres problèmes, vous devez fournir plus d'informations.

190voto

Jon Skeet Points 692016

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 ci-dessus.

6 votes

@mrmillsy : Ils font des choses différentes. Ma réponse est axée sur "J'ai déjà une liste, et je veux y copier des choses".

0 votes

Vrai. Ma question serait probablement mieux adaptée à une nouvelle question de toute façon. Merci quand même pour la réponse.

3 votes

Si vous vouliez remplacer complètement le contenu d'une liste existante, vous appelleriez d'abord targetList.Clear().

40voto

Paras Points 1104

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

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

Si vous voulez copier les 3 premiers éléments

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

1 votes

C'est la bonne réponse. AddRange ne le précise pas dans la documentation, qu'elle copie ou ajoute simplement des objets par référence, mais si vous recherchez l'implémentation, elle utilise Array.Copy (statique) pour copier les données.

6voto

usefulBee Points 492

Et ce, si la copie d'une seule propriété vers une autre liste est nécessaire :

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

4voto

Girish Nama Points 11

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

Utilisez :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X