Come copio gli articoli da un elenco all'altro senza foreach?


Risposte:


555

Puoi provare questo:

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

o se stai usando C # 3 e .NET 3.5, con Linq, puoi farlo:

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

14
Se gli articoli sono di tipo MyClassinvece di Integer, li copia anche o li fa semplicemente riferimento?
Pedro Moreira,

6
Non funziona con tipi non primitivi. Elenco <StudentClass> copy = new Elenco <StudentClass> (lstStudentClass);
sgargiante

4
Funziona con tutti i tipi, purché lstStudentClasssia un IEnumerable<StudentClass>, funzionerà. In caso contrario, è necessario fornire ulteriori informazioni.
Lasse V. Karlsen,

1
qual è il significato di (originale); alla fine
Rahul Chaudhari,

1
Si passa una raccolta al costruttore dell'elenco e il costruttore copierà quindi tutti gli elementi di quella raccolta nell'elenco appena creato.
Lasse V. Karlsen,

170

Per aggiungere il contenuto di un elenco a un altro elenco già esistente, è possibile utilizzare:

targetList.AddRange(sourceList);

Se vuoi solo creare una nuova copia dell'elenco, vedi la risposta di Lasse.


6
@mrmillsy: Beh, fanno cose diverse. La mia risposta è incentrata su "Ho già un elenco e voglio copiarvi le cose"
Jon Skeet,

Vero. La mia domanda sarebbe probabilmente più adatta a una nuova domanda comunque. Grazie per la risposta però.
mrmillsy,

1
Se si desidera sostituire completamente il contenuto di un elenco esistente, è necessario chiamare targetList.Clear () per primo.
Ibraheem,

33

Per un elenco di elementi

List<string> lstTest = new List<string>();

lstTest.Add("test1");
lstTest.Add("test2");
lstTest.Add("test3");
lstTest.Add("test4");
lstTest.Add("test5");
lstTest.Add("test6");

Se vuoi copiare tutti gli elementi

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

Se vuoi copiare i primi 3 elementi

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

5

E questo se è necessario copiare una singola proprietà in un altro elenco:

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

4

Questo metodo creerà una copia del tuo elenco ma il tuo tipo dovrebbe essere serializzabile.

Uso:

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

Metodo:

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 serializzazione crea una significativa penalizzazione delle prestazioni?
Dan Def,

0

OK, questo funziona bene Dai suggerimenti sopra GetRange () non funziona per me con un elenco come argomento ... quindi addolcisci un po 'le cose dai post sopra: (grazie a tutti :)

/*  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
Questa non è nemmeno una risposta.
Maciej Jureczko,

mmm ... ok bene alcuni dei suggerimenti di cui sopra semplicemente non funzionano in Vis 17 Ho ripulito la migliore risposta fornita ... e hey presto ... funziona :)
Jim Stevens

0

Facile mappare diversi set di elenchi tramite linq senza per loop

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

Ecco un altro metodo, ma è un po 'peggio rispetto ad altri.

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

24
Perché dovresti farlo? Perché non ToList()direttamente?
nawfal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.