L'équivalent de StringBuilder pour les tableaux d'octets
C'est simple, et qui à mon avis aurait été répondu. J'ai essayé de trouver une réponse ici, mais n'est pas venu avec quelque chose - alors, toutes mes excuses si il y a quelque chose que j'ai manqué.
De toute façon, est-il un équivalent de StringBuilder mais pour les tableaux d'octets?
Je ne suis pas dérangé sur toutes les différentes surcharges de Append()
- mais j'aimerais voir Append(byte)
et Append(byte[])
.
Il n'y a rien autour, ou est-il à rouler de temps?
Vous devez vous connecter pour publier un commentaire.
Serait
MemoryStream
travail pour vous? L'interface peut être pas tout à fait comme pratique, mais il offre un moyen simple pour ajouter des octets, et lorsque vous avez terminé, vous pouvez obtenir le contenu de l'byte[]
en appelantToArray()
.Plus
StringBuilder
-comme l'interface pourrait probablement être réalisé par l'élaboration d'une méthode d'extension.Mise à jour
Les méthodes d'Extension pourrait ressembler à ceci:
Utilisation:
new[] { value }
avant, c'est que inférer le type de la matrice?value
est de typebyte
, doncbyte[]
est déduit. Dans le dernier exemple, j'ai besoin de spécifiernew byte[]
depuis le compilateur pourrait déduire le typeint
autrement.MemoryStream
pour que. Je ne connais pas d'autre classe que laQueue<byte>
à partir du haut de ma tête.stream.WriteByte(value)
pour laAppend
surcharge qui prend un seul octet comme elle permettrait d'éviter les intermédiairesbyte[]
allocation de tableau.La
MemoryStream
approche est bonne, mais si vous voulez avoir StringBuilder-comme le comportement ajouter unBinaryWriter
. BinaryWriter fournit toutes les Écrire remplacements que vous voulez.stream.ToArray();
Probablement
List<byte>
:StringBuilder
, ajout d'éléments à unList
est amorti O(1).StringBuilder
, C#List
utilise une sauvegarde de capacité supérieure à la taille de la structure de données afin de permettre la constante de temps des insertions. Cette capacité est doublée en tant que de besoin. Cette stratégie est la même stratégieStringBuilder
utilise pour éviter les excès de l'allocation mémoire.ICollection<T>
puis leAddRange
méthode utilise la collectionCount
de la propriété afin de pré-allouer de la liste à la bonne taille (si nécessaire). Si ce n'est pas uneICollection<T>
la liste doivent être redimensionnées à la volée que les éléments sont ajoutés.StringBuilder
queMemoryStream
est manquant estStringBuilder.Remove()
.List<byte>
semble fournir un équivalent exact avecList<T>.RemoveRange()
. Le manque de souplesse deMemoryStream
’s de l'API me fait soupçonner qu'il peut être plus efficace sur les opérations etList<T>
soutien, mais je n'ai pas testé cette.List<byte>
Puis quand vous le voulez comme un tableau, vous pouvez appelerToArray()