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

319

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

miteux
la source
3
Si vous avez besoin d'un clone profond de la liste d'origine, vous trouverez la réponse dans cette question connexe: stackoverflow.com/questions/222598/…
Dirk Vollmar

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();
Lasse V. Karlsen
la source
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.

Jon Skeet
la source
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);
Paras
la source
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));
utileBee
la source
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;
    }
criard
la source
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 );
}
Jim Stevens
la source
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();
Rajeev
la source
-9

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

List<int> i=original.Take(original.count).ToList();
miteux
la source
24
Pourquoi ferais-tu ça? Pourquoi pas ToList()directement?
nawfal