Mehrere Bytearrays zu einem
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.
-
-
Am einfachsten mit der CopyTo()-Methode. Erstelle erst ein neues Array mit der gesamtgröße, und dann kopiere die alten Arrays an ihre neue Stelle.
-
-
-
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
Kann man auch verwenden, wenn Performance keine Rolle spielt. Die List kann auch noch per ToArray() ein Bytearray zurückgeben.
-
-
Hi
oder
VB.NET-Quellcode
- Shared Function Concat(ByVal ParamArray arrays()() As Byte) As Byte()
- Dim target() As Byte
- Dim len As Long
- For Each ba As Byte() in arrays
- len += ba.LongLength
- Next
- target = DirectCast(Array.CreateInstance(GetType(Byte), len), Byte())
- len = 0
- For Each ba As Byte() in arrays
- Array.Copy(ba, ba.GetLowerBound(0), target, len, ba.LongLength)
- len += ba.LongLength
- Next
- Return target
- End Function
(arrays mit unterer Grenze sieht man allerdings eh nie, also wäre das GetLowerBound evtl. auch zu vernachlässigen)
NextDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()
-
Wie benutzt man deine Concat-Funktion?
Bei mir wird in Zeile 5 das a1 angemeckert:
Ein Wert des Typs "1-dimensionales Array von Byte" kann nicht in "1-dimensionales Array von 1-dimensionales Array von Byte" konvertiert werden, da "Byte" nicht von "1-dimensionales Array von Byte" abgeleitet ist.
Ich habe FW4.0 eingestellt...
Kommando zurrück, ich habs...
geht auch nichtDieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()
-
Die (sehr praktische) Concat methode von blaze erwartet natürlich ein Parameter-Array als Eingabe, also Concat(a1, a2) usw
-
So sollte es tun. Jetzt kannst du es einfach so übergeben, wie du wolltest, ohne das ParamArray würde es
heißen müssen, also ein Array von einem Array. Kann man übrigens auch noch für beliebige T definieren:
VB.NET-Quellcode
- Shared Function Concat(Of T)(ByVal ParamArray arrays()() As T) As T()
- If arrays Is Nothing Then Throw New ArgumentNullException("arrays")
- Dim target() As T
- Dim len As Long
- For Each ba As T() in arrays
- len += ba.LongLength
- Next
- target = DirectCast(Array.CreateInstance(GetType(T), len), T())
- len = 0
- For Each ba As T() in arrays
- Array.Copy(ba, ba.GetLowerBound(0), target, len, ba.LongLength)
- len += ba.LongLength
- Next
- Return target
- End Function
Gruß
~blaze~Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()
-
-
List(Of T) macht übrigens sogesehen alles ähnlich. Ein T-Array liegt der Liste zugrunde, es verfügt über eine int-Variable, die die aktuelle Zahl der Elemente count festhält und noch paar andere Sachen. Das Array ist nicht unbedingt so groß wie count und die tatsächliche Array-Kapazität müsste man vorher berechnen, sonst muss das darunterliegende Array jedes mal vergrößert werden. Arrays sind aber an sich Speicherblöcke mit fester Größe, d.h. es muss komplett neuer Speicher angefordert und bestehender kopiert werden, wenn das Array zu klein wird und das kann sich bei einer großen Zahl an T-Arrays extrem stark auf die Performance auswirken. D.h. normalerweise berechnet man vorher die Kapazität und übergibt sie an den Konstruktor oder die Capacity-Eigenschaft oder man macht's gleich selber, dann fällt der ToArray-Aufruf auch noch mit weg, da müssen halt ebenfalls ein neues Array angelegt und die Daten reinkopiert werden (wobei das nicht "so" schlimm ist, wie ständige Vergrößerungen).
Gruß
~blaze~ -
Wenn List intern Arrays verwendet, gibt es denn in .NET eine Implementierung (doppelt)verketteter Listen?
-
LinkedList(Of T). Das Problem bei verketteten Listen ist halt, dass sie nicht in dem Sinne ILists sind, da eine Indizierbarkeit wegfällt. Außerdem sind halt Speicherverbrauch und "Fragmentierung" höher, während bei einem Array die einzelnen Speicherblöcke sequentiell angeordnet sind und sich Anfang und Ende durch Zeiger bzw. Zahlen bestimmen lassen.
Gruß
~blaze~ -
hm, was ist dann überhaupt ein vorteil der verketteten listen?
-
Z.B. das Einfügen von Elementen in eine bestehende Liste. Bei einem Array müsste ggf. das Array erst vergrößert werden, danach alle Elemente am und nach dem Index, an dem das Element eingefügt wird, nach hinten verschoben werden und danach das Element gesetzt werden. Bei verketteten Listen wird einfach nur Next vom Vorgänger und Previous vom Nachfolger neu gesetzt.
Da das mit dem Array vllt. bisschen unverständnlich ist, hier mal meine Art, es zu implementieren:
VB.NET-Quellcode
- Private ReadOnly _underlyingArray() As T
- Private ReadOnly _hold As Integer = 256 'Differenz, um die ein zu kleiner Puffer vergroessert werden soll
- Private _count As Integer
- Public Sub Insert(ByVal index As Integer, ByVal item As T) Implements IList(Of T).Insert
- If index < 0 OrElse index > _underlyingArray.Length Then Throw New IndexOutOfRangeException("index")
- Extend(1) 'ggf. um mind. 1 Element vergrößern
- 'Alle Elemente ab index um 1 nach hinten verschieben
- Array.Copy(_underlyingArray, index, _underlyingArray, index + 1, _underlyingArray.Length - index)
- _underlyingArray(_count) = item 'Element setzen
- _count += 1
- End Sub
- Private Sub Extend(ByVal delta As Integer)
- Dim size As Integer = _count + delta
- If size > _underlyingArray.Length Then
- Array.Resize(_underlyingArray, size + _hold - size Mod _hold) 'auf ein Vielfaches von _hold vergroessern
- End If
- End Sub
Ist jetzt wieder aus dem Kopf implementiert, kann also gut sein, dass Logikfehler enthalten sind (oder Fehler :P). Das Prinzip sollte aber erkennbar sein.
Gruß
~blaze~ -
ja, stimmt, danke. find man sollte immer so abwägen, was denn nun wichtiger ist bei einem bestimmten problem.
-
Quadsoft schrieb:
hm, was ist dann überhaupt ein vorteil der verketteten listen?
Ich hab die MS-LinkedList noch nie sinnvoll einsetzen können.
Es kam durchaus vor, dassich mal eine doppelt verkettete Liste gebraucht hab, aber am Ende stellte sich olle List(Of T) doch als praktischer heraus.
Und einmal, für eine Undo-Verwaltung, was ja eiglich die Klassische Anwendung einer LinkedList sein sollte, hat die MS-LinkedList immer noch nicht getaugt, und ich hab mir eine eigene LinkedList geschrieben.
Man muß auch bedenken, dass List(Of T) irrsinnig grauenhaft schnell ist. Ist ziemlich sch...-egal, dass da zum Einfügen und Removen immer der ganze Salat umkopiert wird.
Das erfolgt hochoptimiert, ich glaub sogar mit speziellen Prozessorbefehlen.
ein Bekannter wolltemal die .Net Auflistungsklassen alle neu schreiben, weiler die vom Design her vermurkst fand. Hat er aufgegeben, weil das schnellste, wasser zuwege brachte, immer noch zig mal langsamer war als die doofe List(oft).
Weil da kanner ganz fabelhaftes Design programmieren - benutzen wird das keinerDieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
Tags
-
Ähnliche Themen
-
Gelöschter Benutzer - - Sonstige Problemstellungen
-
pc-freack - - Sonstige Problemstellungen
-
7 Benutzer haben hier geschrieben
- Quadsoft (6)
- ~blaze~ (5)
- schockerjo (3)
- VB1963 (2)
- SpaceyX (1)
- RodFromGermany (1)
- ErfinderDesRades (1)