Copie profonde de List & lt; T & gt;
Je suis en train de faire une copie d'une liste générique, et je me demande si il n'y a aucune autre façon, puis la création de la méthode de copie et de les copier sur chaque membre un par un. J'ai une classe qui ressemble un peu à ceci:
public class Data
{
private string comment;
public string Comment
{
get { return comment; }
set { comment = value; }
}
private List<double> traceData;
public List<double> TraceData
{
get { return traceData; }
set { traceData = value; }
}
}
Et j'ai une liste de données ci-dessus, j'.e List<Data>
. Ce que j'essaie de faire est de tracer une trace des données du sous-ensemble de la Liste sur un graphique, éventuellement avec certains d'échelle ou de balayage sur les données. Évidemment je n'avez pas besoin de complot tout dans la liste parce qu'il ne rentre pas dans l'écran.
J'ai d'abord essayé d'obtenir le sous-ensemble de la liste à l'aide de la List.GetRange()
méthode, mais il semble que le dessous de la List<double>
est peu profonde copier au lieu de profonde copié. Quand je reçois le sous-ensemble de nouveau en utilisant la Liste.GetRange(), j'ai déjà modifié les données, pas les données brutes extraites ailleurs.
Quelqu'un peut-il me donner une orientation sur la manière d'aborder ce? Merci beaucoup.
source d'informationauteur thomas1234
Vous devez vous connecter pour publier un commentaire.
La idiomatiques façon d'aborder cette question en C# est de mettre en œuvre
ICloneable
sur votreData
et écrire uneClone
méthode qui ne le copie en profondeur (et puis sans doute unEnumerable.CloneRange
méthode qui permet de cloner une partie de votre liste à la fois). Il n'y a pas dans le truc ou le cadre de la méthode pour le rendre plus facile que cela.À moins que la mémoire et les performances sont un réel souci, je suggère que vous essayez dur pour refaire fonctionner sur immuable
Data
objets, même si, à la place. Il finiras beaucoup plus simple.Vous pouvez essayer ce
Grâce à DetoX83 l'article sur le projet de code.
Si IClonable est trop difficile pour vous. Je suggère de conversion à quelque chose et à l'arrière. Il peut être fait avec BinaryFormatter ou un Json Convertisseur comme Servicestack.Texte puisqu'il est le plus rapide .Net.
Code doit être quelque chose comme ceci:
mcCloned pas référence mc.
Le plus simple (mais sale) est de mettre en œuvre
ICloneable
par votre classe et de l'utilisation suivante de la méthode d'extension:Utilisation:
une autre chose que vous pouvez faire est de marque de votre classe comme
serializable
et d'utiliser la sérialisation binaire.Voici un exemple de travail
Si vous apportez vos objets immuables vous n'avez pas besoin de vous soucier de faire circuler des copies d'eux, alors vous pourriez faire quelque chose comme:
Depuis votre collection est mutable, vous avez besoin pour mettre en œuvre la copie en profondeur du programme:
La
Comment
champ peut être peu profonde, copié car son déjà immuable de la classe. Vous devez créer une nouvelle liste pourTraceData
mais les éléments eux-mêmes sont immuables et ne nécessitent pas de manipulation spéciale pour les copier.Utiliser votre nouveau
DeepCopy
méthode en tant que telle:Un rapide et générique façon de profondément sérialiser un objet à l'aide de JSON.net. La suite de la méthode d'extension permet la sérialisation d'une liste de tout les objets arbitraires, mais il est capable de sauter d'Entity Framework de navigation propriétés, puisque ceux-ci peuvent conduire à des dépendances circulaires et des données indésirables extrait.
Méthode
Utilisation
Par défaut, JSON.NET sérialise uniquement des propriétés publiques. Si les propriétés privées doivent être également cloné, cette solution peut être utilisé.
Cette méthode permet de rapide de la (dé)sérialisation de hiérarchies complexes d'objets.