Si vous ne comptez effectuer cette opération qu'une seule fois, il n'y a pas beaucoup de choix. Le code fourni par la réponse de Monroe devrait très bien faire l'affaire.
byte[] newValues = new byte[values.Length + 1];
newValues[0] = 0x00; // définir la valeur précédente
Array.Copy(values, 0, newValues, 1, values.Length); // copier les anciennes valeurs
Cependant, si vous envisagez d'effectuer cette opération plusieurs fois, vous avez plus de choix. Il y a un problème fondamental avec l'ajout de données au début d'un tableau qui n'est pas une opération efficace, vous pourriez donc choisir d'utiliser une structure de données alternative.
Une LinkedList
peut ajouter efficacement des données au début, mais elle est généralement moins efficace pour la plupart des tâches car elle implique beaucoup plus d'allocation/libération de mémoire et perd également la localité de la mémoire, ce qui pourrait ne pas être un gain net.
Une file à double extrémité (connue sous le nom de deque) serait une fantastique structure de données pour vous. Vous pouvez ajouter efficacement au début ou à la fin, et accéder efficacement aux données n'importe où dans la structure (mais vous ne pouvez pas insérer efficacement ailleurs qu'au début ou à la fin). Le principal problème ici est que le .NET ne fournit pas d'implémentation de deque. Vous devriez trouver une bibliothèque tierce avec une implémentation.
Vous pouvez également économiser beaucoup lors de la copie en gardant une trace des "données que je dois ajouter au début" (en utilisant une List/Queue/etc.) et en attendant d'ajouter réellement les données aussi longtemps que possible, afin de minimiser la création de nouveaux tableaux autant que possible, tout en limitant le nombre de copies des éléments existants.
Vous pouvez également envisager de modifier la structure afin d'ajouter à la fin, plutôt qu'au début (même si vous savez que vous devrez le renverser plus tard). Si vous ajoutez beaucoup de données en peu de temps, il peut être utile de stocker les données dans une List
(qui peut ajouter efficacement à la fin) et d'ajouter à la fin. Selon vos besoins, il pourrait même être intéressant de créer une classe qui est un wrapper pour une List et qui cache le fait qu'elle est inversée. Vous pourriez faire un indexeur qui mappe i
à Count-i
, etc. pour que cela apparaisse, de l'extérieur, comme si vos données étaient stockées normalement, même si la List interne tient en réalité les données à l'envers.