2009-02-26 32 views
17

Jeśli mam tablicę bajtów utworzony bajt [] binBuffer = nowy bajt [256] i zapełniam 100 bajtów tablicy, jeśli chcę przekazać tylko te 100 bajtów do jakiejś innej metody , czy można to zrobić bez tworzenia nowej tablicy bajtów o wielkości 100 bajtów, kopiowania ze starej tablicy do nowej, a następnie przekazywania nowej tablicy? Czy w jakiś sposób mogę po prostu przekazać pierwsze 100 bajtów. Moja aplikacja szczególnie dotyczy przekazywania tablicy do procedury przechowywanej.przy użyciu części tablicy bajtów

Odpowiedz

2

Jeśli można użyć LINQ:

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

Jestem zbyt leniwy, by to sprawdzić - ale czy to naprawdę NIE wystarczy skopiować tablicę do nowej tablicy o rozmiarze 100? –

+0

Zgadzam się z Andrzejem. To powinno być dwukrotnie sprawdzone. –

+0

Stan dokumentacji wskazuje, że metoda używa odroczonego wykonywania, reprezentowane zapytanie nie zostanie wykonane, dopóki obiekt nie zostanie wyliczony za pomocą metody GetEnumerator lub foreach. Take (src) wylicza źródło i podaje elementy, dopóki nie zostaną obliczone elementy count lub src nie zawiera żadnych elementów. Więc zgaduję, że nie kopiuje. – Jeremy

1

jeśli używasz .NET 3.5 można użyć Take() metodę rozszerzenia i wykonaj następujące czynności:

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

Jeśli się zgodzisz, proszę podać, dlaczego ... Możemy więc zrozumieć, dlaczego podana odpowiedź jest nieważna. – Jeremy

+0

Nie zrobiłem tego, ale zakładam, że zostało to zrobione, ponieważ pytanie brzmi "bez tworzenia nowej tablicy bajtów", co z pewnością robi "Take()". – Alex

1

Kiedy tablica jest przekazywana do metody, właściwie odniesienie do niej jest faktycznie przekazywane, ponieważ tablice są w rzeczywistości typami referencyjnymi. Zasadniczo masz wskaźnik do tablicy, a następnie przesunięcie w nawiasach kwadratowych mówi tylko, ile "szczelin" od początku. Dlatego jedynym realnym sposobem na to byłoby przekazanie dwóch parametrów do twojej metody. Jedna jest rzeczywistą tablicą, a druga jest liczbą maksymalną, do której musisz iść, w twoim przypadku byłaby to 100. W tej metodzie możesz jedynie wykonywać iterację w tablicy aż do osiągnięcia maksymalnej liczby.

18

Bardzo powszechne sposoby pracy z buforów jest: wzór

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

. Jednak nie można tego użyć z parametrem SqlCommand /, ponieważ po przypisaniu parametru zużywa on cały bufor. Będziesz potrzebować nowej tablicy:

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

Krótka odpowiedź brzmi: NIE. Cokolwiek robisz (oprócz przekazania samej tablicy jako parametru) utworzy nową tablicę i skopiuje pierwsze 100 bajtów w niej.

Jednak ponieważ nie przekazujesz tablicy według wartości, ale zamiast tego podajesz odniesienie do niej, dlaczego ma to dla ciebie znaczenie, jeśli tablica ma 256 bajtów lub 100? Nie marnujesz więcej pamięci. Być może trzeba będzie podać metodę użycia tej tablicy, ponieważ metoda Length zwróci pełną długość.

EDYCJA: Właśnie zdałem sobie sprawę, że chcesz przekazać tablicę do procedury przechowywanej. Spowoduje to skopiowanie całej tablicy. Będziesz musiał wykonać kopię z tylko elementami, które chcesz przekazać.

Powiązane problemy