Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C#] Creare una copia (deep copy) di una lista di oggetti

    Buongiorno a tutti, vorrei capire qual'è il migliore modo per creare una copia ("deep copy") di una List.
    Molto spesso mi capita di creare delle List temporanee e assegnarli la List originale, questo però vedo che crea solo una variabile che punta allo stesso indirizzo di memoria.

    Per il momento ho ovviato alla situazione richiamando sulla lista originale il metodo ToList()
    codice:
    var listaTemp= listaOrginale.ToList();
    Ho provato a cercare in internet e ho trovato diverse soluzioni ma mi poteste indicare la maniera più corretta per effettura il tutto.

    PS: Le liste contengono oggetti complessi quindi non solo stringhe

    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    Il modo che hai trovato a mio avviso può andare bene, ma quello che dei valutare, secondo me, è quanto grande e "pesante" sia questa lista, perchè altrimenti potrebbe essere più funzionale creare una lista dei soli oggetti modificati (presumo che tu la voglia per gestire in qualche modo le modifiche): se ad esempio a questi oggetti complessi aggiungi un costruttore che accetta come parametro un oggetto dello stesso tipo, valorizzi tutti i dati e questo nuovo oggetto lo metti nella deep copy (oppure fare il contrario, cioè creare una lista dei nuovi oggetti)
    Oppure, forse, invece di utilizzare una classe per l'oggetto complesso, utilizzi una struct (ma anche qui dipende quanto è veramente complesso l'oggetto)
    Riccardo Sadocchi
    Microsoft MCP C#

  3. #3
    Ciao, inanzitutto ti ringrazio della risposta.
    Riguardo al fatto di creare una classe con un costruttore che accetta un oggetto dello stesso tipo, ci ho pensato, ma molto spesso è una strada impraticabile, in quanto solitamente le classi che utilizzo hanno una quantità considerevole di proprietà. Ad esempio utilizzando database con oltre 50 colonne, tramite LINQ to SQL genero classi con 50 e passa proprietà, non è fattibile creare un costruttore e assegnare tutte le proprietà all'istanza, a meno che si utilizzi la reflection, che è a mio avviso un'operazione delicata. La mia richiesta a questo punto è: a prescindere dalla complessità dell'oggetto, qual'è il migliore modo per fare una copia di un oggetto senza passare dall'assegnazione manuale parametro per parametro?
    Ultima modifica di rangers97; 08-06-2018 a 09:46

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2011
    residenza
    Arezzo
    Messaggi
    194
    secondo me, banalmente, è quello di utilizzare una struct allora e non una classe, ma credo che nel tuo caso devi pensare di creare qualcosa (tipo un metodo o come dicevamo un costruttore della classe) che faccia questo lavoro, scritto una volta...
    Riccardo Sadocchi
    Microsoft MCP C#

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    La mia richiesta a questo punto è: a prescindere dalla complessità dell'oggetto, qual'è il migliore modo per fare una copia di un oggetto senza passare dall'assegnazione manuale parametro per parametro?
    Credo che non ci siano molte alternative purtroppo, salvo l'uso della Reflection - come hai già indicato - oppure passare attraverso qualche forma di (de)serializzazione, o in alternativa implementare la copia in modo "custom".

    Siccome possono esserci comunque scenari particolari da gestire, magari da configurare, potresti ricorrere a un "Type Mapper" di terze parti, come ad esempio AutoMapper, che è quello che uso più spesso.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.