2009-02-26 18 views
17

Si tengo una matriz de bytes creados byte [] binBuffer = new byte [256] y llené 100 bytes de la matriz, si quiero pasar solo esos 100 bytes a algún otro método , ¿es posible hacer eso sin crear una nueva matriz de bytes de 100 bytes, copiar de la matriz anterior a la nueva, y luego pasar la nueva matriz? ¿De alguna manera puedo pasar los primeros 100 bytes? Mi aplicación se aplica específicamente para pasar la matriz a un procedimiento almacenado.usando parte de una matriz de bytes

Respuesta

2

Si puede utilizar LINQ:

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

Soy demasiado perezoso para comprobarlo, pero ¿realmente eso NO solo copia la matriz a una nueva matriz de tamaño 100? –

+0

De acuerdo con Andrew. Esto debe ser verificado dos veces. –

+0

Los documentos indican que el método usa la ejecución diferida, la consulta representada no se ejecuta hasta que el objeto se enumera con GetEnumerator o foreach. Take (src) enumera los elementos de origen y de rendimiento hasta que se obtengan los elementos de conteo o src no contenga más elementos. Así que supongo que no se copia. – Jeremy

1

si está utilizando .NET 3.5 se puede utilizar el método de extensión Take() y hacer lo siguiente:

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 votó negativamente, indique por qué ... Para que podamos entender por qué la respuesta dada no es válida. – Jeremy

+0

No bajé, pero supongo que fue porque la pregunta dice "sin crear una nueva matriz de bytes", lo que 'Take()' ciertamente hace. – Alex

1

Cuando se pasa un array a un método, solo se pasa una referencia a él, ya que las matrices son en realidad tipos de referencia. Básicamente tiene un puntero a la matriz, y luego el desplazamiento en los corchetes solo le dice cuántas "ranuras" están alejadas del inicio. Por lo tanto, la única forma real de hacerlo sería pasar dos parámetros a su método. Una es la matriz real, y la segunda es el número máximo hasta donde tiene que ir, en su caso sería 100. En ese método, solo iterará a través de la matriz hasta que se alcance el número máximo.

18

Un patrón muy común cuando se trabaja con tampones es el: Modelo

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

. Sin embargo, no puede usar esto con un parámetro SqlCommand /, ya que cuando asigna un parámetro, consume todo el búfer. Necesitará una nueva matriz:

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

La respuesta corta es: NO. Cualquier cosa que hagas (además de pasar la matriz misma como parámetro) creará una nueva matriz y copiará los primeros 100 bytes en ella.

Sin embargo, dado que no está pasando la matriz por valor, sino que está pasando una referencia a ella, ¿por qué le importa si la matriz es de 256 bytes o 100? No estás desperdiciando más memoria. Sin embargo, es posible que necesite decirle al método cuánto de esa matriz usar, ya que el método Length devolverá la longitud completa.

EDIT: Me acabo de dar cuenta de que desea pasar la matriz a un procedimiento almacenado. Esto copiará toda la matriz. Tendrá que hacer una copia con solo los elementos que desea aprobar.

Cuestiones relacionadas