Como copiar itens de uma lista para outra sem foreach?

319

Como transfiro os itens contidos um Listno outro em C # sem usar foreach?

atrevido
fonte
3
Se você precisar de um clone profundo da lista original, encontrará a resposta nesta pergunta relacionada: stackoverflow.com/questions/222598/…
Dirk Vollmar

Respostas:

555

Você pode tentar o seguinte:

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

ou se você estiver usando C # 3 e .NET 3.5, com Linq, poderá fazer o seguinte:

List<Int32> copy = original.ToList();
Lasse V. Karlsen
fonte
14
Se os itens são do tipo em MyClassvez de Integer, eles também são copiados ou apenas os referenciam?
Pedro Moreira
6
Não está funcionando com tipos não primitivos. List <StudentClass> copy = new List <StudentClass> (lstStudentClass);
vistoso
4
Funciona com todos os tipos, desde que lstStudentClassseja um IEnumerable<StudentClass>, funcionará. Se você tiver outra experiência, precisará fornecer mais informações.
Lasse V. Karlsen
1
qual é o significado de (original); no final
Rahul Chaudhari
1
Você passa uma coleção para o construtor da lista, e o construtor copiará todos os elementos dessa coleção para a lista recém-criada.
Lasse V. Karlsen
170

Para adicionar o conteúdo de uma lista a outra lista que já existe, você pode usar:

targetList.AddRange(sourceList);

Se você deseja criar uma nova cópia da lista, consulte a resposta de Lasse.

Jon Skeet
fonte
6
@mrmillsy: Bem, eles fazem coisas diferentes. Minha resposta é focada em "Já tenho uma lista, e eu quero copiar coisas para ele"
Jon Skeet
Verdade. Minha pergunta provavelmente seria mais adequada para uma nova pergunta de qualquer maneira. Obrigado pela resposta embora.
Mrmillsy #
1
Se você deseja substituir completamente o conteúdo de uma lista existente, chame targetList.Clear () primeiro.
Ibraheem
33

Para uma lista de elementos

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 você deseja copiar todos os elementos

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

Se você deseja copiar os 3 primeiros elementos

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

E isso é necessário para copiar uma única propriedade para outra lista:

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

Este método criará uma cópia da sua lista, mas seu tipo deve ser serializável.

Usar:

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

Método:

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;
    }
extravagante
fonte
A serialização cria uma penalidade de desempenho significativa?
11489 Dan Def
0

OK, isso está funcionando bem. Das sugestões acima, GetRange () não funciona para mim com uma lista como argumento ... então, adocico um pouco as postagens acima: (obrigado a todos :)

/*  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
fonte
2
Esta nem é uma resposta.
Maciej Jureczko 30/08
mmm ... ok bem algumas das sugestões acima simplesmente não fazer o trabalho em Vis 17 eu ter limpado a melhor resposta dada ... e voilá ... ele funciona :)
Jim Stevens
0

Fácil mapear diferentes conjuntos de listas por linq sem for 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();
Rajeev
fonte
-9

Aqui outro método, mas é um pouco pior comparar com outro.

List<int> i=original.Take(original.count).ToList();
atrevido
fonte
24
Por que você faria isso? Por que não ToList()diretamente?
Nawfal # 23/13