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
Jeśli można użyć LINQ:
SomeMethod(binBuffer.Take(100));
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
}
}
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.
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;
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ć.
- 1. Obliczanie liczby wystąpień w liście/tablicy bajtów przy użyciu innej listy/tablicy bajtów
- 2. Wysyłanie tablicy bajtów w jsonie przy użyciu jacksona
- 3. Wyświetlanie tablicy bajtów jako obrazu przy użyciu JavaScriptu
- 4. Unsafe.As z tablicy bajtów do tablicy ulong
- 5. Wymazywanie części bitmapowych przy użyciu trybu PorterDuff
- 6. Sortowanie tablicy przy użyciu innej tablicy
- 7. Serializowanie poszarpanej tablicy bajtów wydajnie
- 8. Kopiowanie tablicy bajtów do innej tablicy bajtów w C#
- 9. Umieszczanie tablicy przy użyciu formularza
- 10. tablicy dwuwymiarowej przy użyciu szablonów
- 11. Znajdź sekwencję bajtów w tablicy bajtów.
- 12. Usuwanie pierwszych 16 bajtów z tablicy bajtów
- 13. String do tablicy bajtów
- 14. Konwersja tablicy bajtów do klasy zawierającej tablicę bajtów w C#
- 15. C#: Dzielenie tablicy na n części
- 16. AngularJS - Pokaż zawartość tablicy bajtów jako obrazu
- 17. Wyjątek java.nio.BufferUnderflowException przy konwersji tablicy bajtów na podwójny
- 18. Nie można odczytać tablicy bajtów (utworzonej z pliku .docx) do obiektu Doc przy użyciu ABCPDF
- 19. Jak skopiować jeden strumień do tablicy bajtów przy użyciu najmniejszego kodu C#?
- 20. Kompresja GZIP do tablicy bajtów
- 21. konwersja tablicy bajtów do obrazu
- 22. Deklarowanie tablicy bajtów w VB.NET
- 23. Konwersja bitmapy do tablicy bajtów
- 24. Szybkie przesunięcie bitowe tablicy bajtów - podklucze CMAC:
- 25. MEF: Przekazywanie różnych parametrów konstruktora do części przy użyciu CreationPolicy.NonShared
- 26. Konwersja części Json na HashMap przy użyciu obiektu Jackson ObjectMapper
- 27. Oblicz sumę części wektora przy użyciu std :: gromadzić
- 28. Błąd przy użyciu części z wtyczką Webpack HTML
- 29. Matlab - Indeksowanie tablicy przy użyciu wartości łańcuchów
- 30. Parsowanie tablicy JSON przy użyciu Json.Net
Jestem zbyt leniwy, by to sprawdzić - ale czy to naprawdę NIE wystarczy skopiować tablicę do nowej tablicy o rozmiarze 100? –
Zgadzam się z Andrzejem. To powinno być dwukrotnie sprawdzone. –
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