web-dev-qa-db-fra.com

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

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

274
ratty

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();
502

Pour ajouter le contenu d'une liste à une autre liste existante, vous pouvez utiliser:

targetList.AddRange(sourceList);

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

159
Jon Skeet

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);
31
Paras

Et ceci est nécessaire si la copie d'une propriété unique vers une autre liste est nécessaire:

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

Cette méthode créera une copie de votre liste mais votre type devrait ê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;
    }
4
garish

OK, cela fonctionne bien D'après les suggestions ci-dessus, GetRange () ne fonctionne pas pour moi avec une liste comme argument ... adoucissez donc un peu les messages des messages 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 );
}
0
Jim Stevens