2009-02-26 7 views
17

Si j'ai un tableau d'octets créé byte [] binBuffer = new byte [256] et je remplis 100 octets du tableau, si je veux passer seulement ces 100 octets à une autre méthode , est-ce possible de le faire sans créer un nouveau tableau d'octets de 100 octets, en copiant de l'ancien tableau vers le nouveau, puis en passant le nouveau tableau? Est-ce que je peux en quelque sorte juste passer les 100 premiers octets. Mon application s'applique spécifiquement à passer le tableau à une procédure stockée.en utilisant une partie d'un tableau d'octets

Répondre

2

Si vous pouvez utiliser LINQ:

SomeMethod(binBuffer.Take(100)); 
+0

Je suis trop fainéant pour vérifier - mais est-ce que cela ne fait PAS que copier le tableau dans un nouveau tableau de taille 100? –

+0

D'accord avec Andrew. Cela devrait être revérifié. –

+0

Les docs indiquent que la méthode utilise l'exécution différée, la requête représentée n'est pas exécutée tant que l'objet n'est pas énuméré avec GetEnumerator ou foreach. Take (src) énumère la source et fournit des éléments jusqu'à ce que les éléments count soient fournis ou que src ne contienne plus d'éléments. Donc je devine qu'il ne copie pas. – Jeremy

1

si vous utilisez .net 3.5, vous pouvez utiliser la méthode d'extension Take() et procédez comme suit:

class Program 
{ 
    static void Main(string[] args) 
    { 
     byte[] b = new byte[1000]; 

     dowork(b.Take(10).ToArray()); 

    } 

    public static void dowork(byte[] b) 
    { 
     // do some work 
    } 
} 
+0

Si vous downvote, veuillez préciser pourquoi ... Nous pouvons donc comprendre pourquoi la réponse donnée n'est pas valide. – Jeremy

+0

Je n'ai pas effectué le downvoting, mais je suppose que cela a été fait parce que la question dit "sans créer un nouveau tableau d'octets", ce que 'Take()' fait certainement. – Alex

1

Lorsqu'un tableau est passé à une méthode, seule une référence à celle-ci est réellement passée, puisque les tableaux sont en réalité des types de référence. Vous avez essentiellement un pointeur sur le tableau, puis le décalage entre les crochets vous indique combien de "slots" sont éloignés du début. Par conséquent, la seule façon réelle de le faire serait de passer deux paramètres à votre méthode. L'un étant le tableau actuel, et le second étant le nombre maximum jusqu'à l'endroit où vous devez aller, dans votre cas ce serait 100. Dans cette méthode, vous ne faites qu'opérer dans le tableau jusqu'à ce que le nombre maximum soit atteint.

18

Un motif très fréquent lorsque l'on travaille avec des tampons est le:

Foo(byte[] data, int offset, int count) {...} 
motif

. Cependant, vous ne pouvez pas utiliser ceci avec un paramètre SqlCommand car, lorsque vous affectez un paramètre, il consomme tout le tampon. Vous aurez besoin d'un nouveau tableau:

byte[] second = new byte[100]; 
Buffer.BlockCopy(first, firstOffset, second, 0, 100); 
param.Value = second; 
2

La réponse courte est: NON. Tout ce que vous faites (en plus de passer le tableau lui-même comme paramètre) créera un nouveau tableau et copiera les 100 premiers octets de celui-ci.

Toutefois, comme vous ne transmettez pas le tableau par valeur, mais que vous lui transmettez une référence, pourquoi est-ce important pour vous si le tableau a une taille de 256 octets ou 100? Tu ne gaspilles pas plus de mémoire. Vous devrez peut-être indiquer à la méthode la quantité de ce tableau à utiliser, car la méthode Length retournera toute la longueur.

EDIT: Je viens de me rendre compte que vous voulez passer le tableau à une procédure stockée. Cela va copier le tableau entier. Vous devrez faire une copie avec seulement les éléments que vous voulez passer.

Questions connexes