Verschachtelte Arrays
Hallo Forum,
ich habe in VB.NET 6 Arrays, die alle dieselbe Länge, aber unterschiedliche Datentypen haben. Array1 ist vom Typ Long, Array2 String, Array3 Long, Array4 Long, Array5 String und Array6 ist String.
In einer Schleife werden die Arrays befüllt und anschließend wird jedes Array zuerst in ein 2-dimensionales Array kopiert, das dann in einen Excel-Range übertragen wird.
Stattdessen möchte ich ein verschachteltes Array nutzen, wobei die Schleife jeweils ein Array mit 6 Werten befüllt. Dieses Array ist Element eines übergeordneten Arrays, das dann am Ende wieder nach Excel kopiert wird.
Ist es in VB.NET machbar, dass in einem Array die Elemente unterschiedliche Datentypen haben? Aufgrund der Arraygrößen würde ich ungern mit dem Object-Datentyp arbeiten wollen. Gibt es ggf. Alternativen zu meinem Ansatz, die ähnlich performant sind?
Vielen Dank,
M. Born
ich habe in VB.NET 6 Arrays, die alle dieselbe Länge, aber unterschiedliche Datentypen haben. Array1 ist vom Typ Long, Array2 String, Array3 Long, Array4 Long, Array5 String und Array6 ist String.
In einer Schleife werden die Arrays befüllt und anschließend wird jedes Array zuerst in ein 2-dimensionales Array kopiert, das dann in einen Excel-Range übertragen wird.
Stattdessen möchte ich ein verschachteltes Array nutzen, wobei die Schleife jeweils ein Array mit 6 Werten befüllt. Dieses Array ist Element eines übergeordneten Arrays, das dann am Ende wieder nach Excel kopiert wird.
Ist es in VB.NET machbar, dass in einem Array die Elemente unterschiedliche Datentypen haben? Aufgrund der Arraygrößen würde ich ungern mit dem Object-Datentyp arbeiten wollen. Gibt es ggf. Alternativen zu meinem Ansatz, die ähnlich performant sind?
Vielen Dank,
M. Born
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 270597
Url: https://administrator.de/contentid/270597
Ausgedruckt am: 24.11.2024 um 14:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo Marco,
Könntest Du vielleicht ein paar Codeschnipsel anfügen?
Das würde uns die Lösungsfindung ungemein erleichtern.
Ich habe das nun in etwa so verstanden:
Array1[123, 456, 435, 6537...], Array2["asd", "ert"...]
Und daraus würde dann werden:
Gesamt[Arr1[Array1], Arr2[Array2], ...]
Wäre das dann der Ist- oder der Soll-Zustand?
Was ist denn das allgemeine Ziel des ganzen? Vielleicht gäbe es ja auch eine ganz andere Herangehensweise, welche sich als gut herausstellt.
Beste Grüße
Dominique
Könntest Du vielleicht ein paar Codeschnipsel anfügen?
Das würde uns die Lösungsfindung ungemein erleichtern.
Ich habe das nun in etwa so verstanden:
Array1[123, 456, 435, 6537...], Array2["asd", "ert"...]
Und daraus würde dann werden:
Gesamt[Arr1[Array1], Arr2[Array2], ...]
Wäre das dann der Ist- oder der Soll-Zustand?
Was ist denn das allgemeine Ziel des ganzen? Vielleicht gäbe es ja auch eine ganz andere Herangehensweise, welche sich als gut herausstellt.
Beste Grüße
Dominique
Hallo Marco,
grundsätzlich kannst du Arrays als Object deklarieren und somit in den Items verschiedene Datentypen verwenden.
Ich würde auch eher verschachtelte Arrays mit jeweils definierten Datentypen verwenden.
Somit hättest du ein Array für die Tabelle, welches zeilenweise Arrays besitzt, dessen Items die jeweiligen Spalten darstellen.
Das Konzept kannst Du natürlich auch umdrehen und definierte Datentypen verwenden.
Damit arbeitet es sich leichter und Modellnäher.
Schau mal hier
Beste Grüße
Dominique
grundsätzlich kannst du Arrays als Object deklarieren und somit in den Items verschiedene Datentypen verwenden.
Ich würde auch eher verschachtelte Arrays mit jeweils definierten Datentypen verwenden.
Somit hättest du ein Array für die Tabelle, welches zeilenweise Arrays besitzt, dessen Items die jeweiligen Spalten darstellen.
Das Konzept kannst Du natürlich auch umdrehen und definierte Datentypen verwenden.
Damit arbeitet es sich leichter und Modellnäher.
Schau mal hier
Beste Grüße
Dominique
Ok, um was für Daten handelt es sich denn?
Wie viel ist es, wie wird es unter Word und wie unter Excel repräsentiert?
Eventuell postest du etwas mehr von deinem Code? Oder beispielhafte Dateien?
Mir scheint es, als seien es nicht nur die Datentypen oder die Strukturierung der Arrays, die dir Performance klauen.
Beste Grüße
Dominique
Wie viel ist es, wie wird es unter Word und wie unter Excel repräsentiert?
Eventuell postest du etwas mehr von deinem Code? Oder beispielhafte Dateien?
Mir scheint es, als seien es nicht nur die Datentypen oder die Strukturierung der Arrays, die dir Performance klauen.
Beste Grüße
Dominique
Doch, sicher.
Ich fragte ja bereits nach einer Datenstruktur, dem Code oder anderen Anhaltspunkten, die nahe legen, was du vorhast.
Ich fragte ja bereits nach einer Datenstruktur, dem Code oder anderen Anhaltspunkten, die nahe legen, was du vorhast.
Steht ja alles schon in meinen bisherigen Posts.
Nein. Datenstruktur Ist: 2-dimensionales Array vom Typ String, wobei einzelne Spalten Integer und Long enthalten
Wow, wie erstellt man denn solche Word-Dokumente?Deinem Code ist zu entnehmen, dass das Array mit Werten aus Variablen befüllt wird.
Aber was für Values die Member dann während der Laufzeit bekommen (könnten), erschließt sich meiner Glaskugelmagie.
Code: Siehe Post vom 04.05., 08:58
Das ist nicht sehr vielsagend. Du kannst Kommentare auch verlinkenMeine Frage: Ist es in VB.NET machbar, dass in einem Array die Elemente unterschiedliche Datentypen haben?
Ja.Aufgrund der Arraygrößen würde ich ungern mit dem Object-Datentyp arbeiten wollen.
Dann bau dir was definierteres.Gibt es ggf. Alternativen zu meinem Ansatz, die ähnlich performant sind?
Ja.Von hier:
Structures scheinen mir auch nicht für meine Problem geeignet zu sein. Was könnte man noch ausprobieren?
Warum nicht? Das ist doch genau, was du suchst.Structures scheinen mir auch nicht für meine Problem geeignet zu sein. Was könnte man noch ausprobieren?
Fest definierte Member, kein wahlloses Object, feste Breite, ...
Und was ist mit Mutithreading?
Ein Thread könnte immer eine Menge an Daten einlesen, zerpflücken und an einen zweiten geben, der das Sheet füllt, während der erste wieder dabei ist, zu lesen.
Wenn du eine definierte Menge hast, platzt dein RAM auch nicht so schnell aus allen Nähten.
Weiter oben hast du ja beschrieben, dass du nun darin über gegangen bist, erst komplett einzulesen und dann in's Sheet zu schreiben.
Nicht, dass dein Rechner jenach Datenmenge die Auslagerungswut bekommt
Beste Grüße
Dominique
Das sagt doch schonmal deutlich mehr
Die einzige "Aufgabe" dahinter ist das Nachgehen der Frage, warum eine Exception geworfen wird, wenn du "Blockweise" schreiben möchtest.
mir das sehr entgegen. In Deinem Link (https://msdn.microsoft.com/de-de/library/8k8021te%28v=vs.90%29.aspx) wird ein Object-Array angelegt,
Ja, das war aber auch bevor du erwähntest, dass Objects nicht in Frage kommen und was du genau vorhast.Ich habe Structures bereits getestet. Ich kann problemlos die Werte hineinschreiben, kann diese aber nur Element-weise wieder auslesen. Ein Schreiben per Block nach Excel wird mit einem Laufzeitfehler abgebrochen.
Element-weise?Letztlich interessiert mich lediglich die Aussage, ob ich verschachtelte Arrays bauen kann, bei denen z.B. ein inneres Array Strings und ein weiteres Longs aufnimmt und wie ich dann das äußere Array definiere.
Mein Vorschlag: Eine Structure, die "innere" Typisierte Arrays aufnimmt. Oder auch ein 1-Dimensionales Array aus den selbstdefinierten Structures.Die einzige "Aufgabe" dahinter ist das Nachgehen der Frage, warum eine Exception geworfen wird, wenn du "Blockweise" schreiben möchtest.
Bei der Kommunikation zwischen Excel und meinem .NET-Addin vergeht bei jedem Zugriff auf Excel zuviel Zeit.
Wäre es nicht genau dann von Vorteil, wenn die Schleife selbst nicht genau dieser verstrichenen Zeit zum Opfer fällt? Wenn ich nicht eine Struktur als Ganzes auslesen kann, komme ich so nicht weiter...
Dann mag Excel das wohl garnicht.Ich habe mal ein bisschen herumgewälzt.
Wie es scheint, arbeitet die Excel Interoperabilitätsklasse sowieso mit Objects.
Dein zweidimensionales Array, wie du es weiter oben beschrieben hast, scheint also soweit mir ersichtlich, die beste Variante zu sein.
Ob du nun aus dem String-Array ein Object-Array machst oder nicht... Das ist dem anderen Ende scheinbar schnuppe. Um ein Casting kommst du (wenn ich mich nicht irre) sowieso nicht herum.
Vor allem sehe ich weiter oben, dass du Integer in dein String-Array pumpst. Was würde es also für einen Unterschied machen?
Vor allem ist das zweidimensionale Array auch für Excel hinter dem Interop sehr viel einfacher in eine Range zu setzen als ein verschachteltes Array.
Nun nochmal zu der eigentlichen Performancefrage...
Ich denke, dass dir in diesem Fall das Typisieren zumindest bei der Übertragung in das Excel sheet keinen großen Performancevorteil bringt.
Möchtest du hingegen vorher in deinem Code noch eine Menge mit den Arrays machen (weshalb du vlt. angemakelt hast, dass du mittels Casting darauf zugreifen müsstest) und hättest dafür gerne etwas typisiertes, könntest du dein Array vorher umdrehen.
Du könntest also erstmal mit spaltenweisen Arrays arbeiten:
Dim spalte0(länge) As Integer
Dim spalte1(länge) As String
Dim spalte2(länge) As Integer
Dim spalte3(länge) 'As ???
Dim spalte4(länge) 'As ???
Dim spalte5(länge) As String
'Optional kannst du diese 6 Arrays in ein weiteres (Object) oder eine Structure packen.
'Dim myTable(6) as Object() = {spalte0, spalte1, spalte2, spalte3, spalte4, spalte5}
Public Function umdrehen(ByRef first As Integer(), ByRef second As String()[...]) As Object()
Dim fullTable(länge, 6) As Object 'Hat die Tabelle nun 5 oder 6 Spalten?
For i As Integer = 0 to länge - 1
fullTable(i, 0) = first(i)
fullTable(i, 1) = second(i)
fullTable(i, 2) = third(i)
'[...]
'fullTable könnte auch ein String-Array werden.
End For
Return fullTable
End Function
Aber, wie mir das klingt, wird das alles nie wirklich "schnell" werden. Hier ist VB.Net eventuell nicht das richtige. Oder Excel, oder Word...
Inwieweit z.B. mittels C# Zeiger verwendet werden könnten, um die Daten hin und herzugeben, ist mir nicht klar. Dafür mache ich zu wenig mit Excel.
Um deine eigentliche Frage zu beantworten:
Bei der von dir angegebenen rechteckigen Datenstruktur würde ein verschachteltes Array dir keinen Vorteil zu einem 2-dimensionalen Array bringen.
Beste Grüße
Dominique
Hallo MarcoBorn,
Und unter Source/Excel/Interfaces findest du in der IRange.cs in den Zeilen 569, 2299 und 2327 die Funktionen, welche du aufrufst, wenn du auf Range.Value zugreifst.
Ich habe mir das nicht mehr genauer angesehen, vielleicht hilft dir das aber mal.
Beste Grüße
Dominique
Da ich nicht direkt mit den Interop-Klassen von MS arbeite, sondern mit NetOffice, weiss ich nicht genau, wie das dort intern interpretiert wird
Ich persönlich arbeite auch lieber mit NetOffice. Davon gibt's ein GitHub-RepoUnd unter Source/Excel/Interfaces findest du in der IRange.cs in den Zeilen 569, 2299 und 2327 die Funktionen, welche du aufrufst, wenn du auf Range.Value zugreifst.
Ich habe mir das nicht mehr genauer angesehen, vielleicht hilft dir das aber mal.
Ich glaube, dass ich hier kaum weiterkomme und versuche, in anderen Stellen im Code noch Optimierungsmöglichkeiten zu finden.
Gut, viel Erfolg. Eventuell gibst du ja mal Feedback, wenn etwas interessantes dabei rumkommt.Danke für die Hilfe,
M. Born
Naja, ich hab's wenigstens versucht M. Born
Beste Grüße
Dominique