J'ai un tableau X de 10 éléments. Je voudrais créer un nouveau tableau contenant tous les éléments de X qui commencent à l'index 3 et se terminent à l'index 7. Bien sûr, je peux facilement écrire une boucle qui le fera pour moi mais je voudrais garder mon code aussi propre que possible . Existe-t-il une méthode en C # qui peut le faire pour moi?
Quelque chose comme (pseudo code):
Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)
Array.Copy
ne correspond pas à mes besoins . J'ai besoin que les éléments du nouveau tableau soient des clones. Array.copy
est juste un memcpy
équivalent C-Style , ce n'est pas ce que je recherche.
Réponses:
Vous pouvez l'ajouter comme méthode d'extension:
Mise à jour du re clonage (ce qui n'était pas évident dans la question d'origine). Si vous vraiment voulez un clone profond; quelque chose comme:
Cela nécessite cependant que les objets soient sérialisables (
[Serializable]
ouISerializable
). Vous pouvez facilement se substituer à tout autre sérialiseur selon le cas -XmlSerializer
,DataContractSerializer
, protobuf-net, etc.Notez que le clone profond est délicat sans sérialisation; en particulier, il
ICloneable
est difficile de faire confiance dans la plupart des cas.la source
Vous pouvez utiliser
Array.Copy(...)
pour copier dans le nouveau tableau après l'avoir créé, mais je ne pense pas qu'il existe une méthode qui crée le nouveau tableau et copie une gamme d'éléments.Si vous utilisez .NET 3.5, vous pouvez utiliser LINQ:
mais ce sera un peu moins efficace.
Voir cette réponse à une question similaire pour des options pour des situations plus spécifiques.
la source
Avez-vous pensé à utiliser
ArraySegment
?http://msdn.microsoft.com/en-us/library/1hsbd92d.aspx
la source
IEnumerable<T>
et une variété d'autres interfaces utiles.ArraySegment
pour répondre à la question d'origine?IList<T> newArray = (IList<T>)new ArraySegment<T>(oldArray, beginIndex, endIndex);
Je vois que vous voulez faire du clonage, pas seulement copier des références. Dans ce cas, vous pouvez utiliser
.Select
pour projeter les membres du tableau sur leurs clones. Par exemple, si vos éléments sont implémentés,IClonable
vous pouvez faire quelque chose comme ceci:Remarque: Cette solution nécessite .NET Framework 3.5.
la source
IEnumerable
. Je peux obtenir unIEnumerable
,IList
,IArray
, etc ... avec un minimum de bruit, en ligne si je dois. Si je n'ai pas besoin de la copie complète, je supprime simplement le fichierSelect
. La chuteSkip
ouTake
me permet de contrôler la plage. Alternativement, je peux le mélanger avecSkipWhile
et / ouTakeWhile
.Le code suivant le fait sur une seule ligne:
la source
En C # 8 , ils ont introduit un nouveau
Range
et leIndex
typela source
la source
S'appuyant sur la réponse de Marc mais en ajoutant le comportement de clonage souhaité
Et si implémenter ICloneable ressemble trop à un travail acharné, réfléchissez en utilisant la bibliothèque copiable de Håvard Stranden pour faire le gros du travail nécessaire.
Notez que l'implémentation OX.Copyable fonctionne avec:
Cela devrait donc couvrir presque toutes les situations que vous avez. Si vous clonez des objets où le sous-graphique contient des éléments tels que les connexions db ou les poignées de fichier / flux, vous avez évidemment des problèmes, mais c'est vrai pour toute copie approfondie généralisée.
Si vous souhaitez utiliser une autre approche de copie approfondie à la place, cet article en répertorie plusieurs autres , je vous suggère donc de ne pas essayer d'écrire la vôtre.
la source
Vous pouvez le faire assez facilement;
la source
Je pense que le code que vous recherchez est:
Array.Copy(oldArray, 0, newArray, BeginIndex, EndIndex - BeginIndex)
la source
Au lieu de copier les données, vous pouvez créer un wrapper qui vous donne accès à une partie du tableau d'origine comme s'il s'agissait d'une copie de la partie du tableau. L'avantage est que vous n'obtenez pas une autre copie des données en mémoire, et l'inconvénient est une légère surcharge lors de l'accès aux données.
Usage:
la source
Array.ConstrainedCopy fonctionnera.
la source
Il n'y a pas de méthode unique qui fera ce que vous voulez. Vous devrez rendre une méthode de clonage disponible pour la classe de votre tableau. Ensuite, si LINQ est une option:
la source
Que diriez-vous d' utiliser Array.ConstrainedCopy :
Ci-dessous est mon message d'origine. Ça ne marchera pas
Vous pouvez utiliser Array.CopyTo :
la source
Que dis-tu de ça:
Vous devez ensuite implémenter l'interface ICloneable sur toutes les classes sur lesquelles vous devez l'utiliser, mais cela devrait le faire.
la source
Je ne sais pas à quel point c'est profond, mais:
MyArray.ToList<TSource>().GetRange(beginningIndex, endIndex).ToArray()
C'est un peu de surcharge, mais cela pourrait éliminer une méthode inutile.
la source
C # 8 a fourni une fonctionnalité appelée Range pour obtenir la sous-zone du début à la fin de l'index. vous pouvez l'utiliser comme ça.
la source
En ce qui concerne le clonage, je ne pense pas que la sérialisation appelle vos constructeurs. Cela peut casser les invariants de classe si vous faites des choses intéressantes dans le ctor.
Il semble que le pari le plus sûr soit les méthodes de clonage virtuel appelant les constructeurs de copie.
la source
Le clonage d'éléments dans un tableau n'est pas quelque chose qui peut être fait de manière universelle. Voulez-vous un clonage en profondeur ou une simple copie de tous les membres?
C'est parti pour l'approche du "meilleur effort": clonage d'objets à l'aide de l'interface ICloneable ou sérialisation binaire:
Ce n'est pas une solution parfaite, car il n'y en a tout simplement pas qui fonctionnera pour tout type d'objet.
la source
Vous pouvez prendre des cours faits par Microsoft:
puis
la source
C'est la façon optimale, j'ai trouvé, de le faire:
J'espère que ça aide!
la source
utiliser la méthode d'extension:
et vous pouvez l'utiliser
la source
Code de System.Private.CoreLib.dll:
la source
Il ne répond pas à vos exigences de clonage, mais il semble plus simple que de nombreuses réponses:
la source
la source