Entwickler-Ecke
C# - Die Sprache - Zweidimensionales Array effizient aufteilen
Help_Me - Do 13.05.10 14:50
Titel: Zweidimensionales Array effizient aufteilen
Hallo!
Ich hab ein zweidimensionales Array.
Ich würde gerne aus diesem zweidimensionalen Array die erste Zeile in ein eindimensionales Array einlesen und das zweidimensionale Array um diese Zeile "kürzen".
Über eine for-Schleife habe ich die erste Zeile in mein eindimensionales Array eingelesen. Nur habe ich jetzt noch mein komplettes zweidimensionales Array. Das Problem ist, dass ich seeehr große Datenmengen hab, weswegen das Einlesen mittels einer for-Schleife in ein neues, kleineres Array womöglich zu lange dauern würde.
Was würdet ihr mir raten??
Grüße
Kha - Do 13.05.10 15:59
Wahrscheinlich ist es einfacher, das zweidimensionale Array als List<> von eindimensionalen Arrays darzustellen. Dann kannst du daraus einzelne Zeilen auslesen und mit RemoveAt entfernen, ohne überhaupt etwas kopieren zu müssen.
Help_Me - Fr 14.05.10 09:16
Meldung die ich bekomme: =/
Das Objekt des Typs "System.Object[,]" kann nicht in Typ "System.Collections.Generic.List`1[System.Array]" umgewandelt werden.
Kha - Fr 14.05.10 12:45
Habe auch nicht behauptet, dass sich das implizit umwandeln lässt. Das musst du entweder über zwei Schleifen selbst machen oder (woran ich eigentlich gedacht habe) auf das 2D-Array direkt verzichten.
Help_Me - Fr 14.05.10 13:15
Hmm...ich glaube nicht, dass ich darauf verzichten kann.
Was wäre deiner Meinung nach der beste Weg mit meinem zweidimensionalen Array?
danielf - Fr 14.05.10 13:59
Ein Array ist sehr statisch. Man kann nicht einfach Elemente hinzufügen oder entfernen. Es ist mehr ein ständiges hin und her kopieren und das ist sehr intensiv. Es gibt wahrscheinlich keinen sinnvollen Grund für deine Arrays. Oder kannst du uns einen nennen?
Deshalb bleibt die einfachste Konsequenz auf das Array zu verzichten und stattdessen eine Liste zu nehmen.
Gruß
Help_Me - Fr 14.05.10 14:15
danielf hat folgendes geschrieben : |
Es gibt wahrscheinlich keinen sinnvollen Grund für deine Arrays. Oder kannst du uns einen nennen? |
Einen Grund kann ich euch nennen, vermutlich nur keinen sinnvollen. :wink:
Ich hatte den Code schon in einem anderen Thread gepostet:
C#-Quelltext
1:
| Array array = (Array)myRange.Value; |
Mir ist nicht klar, wie ich die Werte meines Excel-Ranges in eine
List bekomme.
Wenn das geht...super! Nur bräuchte ich dann eure Hilfe, weil bislang ist es mir nicht klar geworden wie ich das hinbekomme.
Mitmischer 1703 - Fr 14.05.10 14:42
C#-Quelltext
1:
| Array array = (Array)myRange.Value; |
Öhm... wieso brauchst du dafür ein Array oder List?
Wie dem auch sei, es gibt in der Klasse List die Methoden AddRange und Add. Die sollten weiterhelfen.
Help_Me - Fr 14.05.10 14:55
Ah okay, super! Damit werd ichs mal versuchen. Aber dazu:
Mitmischer 1703 hat folgendes geschrieben : |
Öhm... wieso brauchst du dafür ein Array oder List?
|
Wie arbeitet man sonst damit, bzw. wie würdest du das tun?
Ich greif später auf die einzelnen Werte innerhalb dieses Range zu, das erscheint mir mit dem Array deutlich einfacher, bzw. mit einer List.
Mitmischer 1703 - Fr 14.05.10 15:01
Help_Me hat folgendes geschrieben : |
Ah okay, super! Damit werd ichs mal versuchen. Aber dazu: Mitmischer 1703 hat folgendes geschrieben : |
Öhm... wieso brauchst du dafür ein Array oder List?
|
Wie arbeitet man sonst damit, bzw. wie würdest du das tun?
Ich greif später auf die einzelnen Werte innerhalb dieses Range zu, das erscheint mir mit dem Array deutlich einfacher, bzw. mit einer List. |
Wenn das mehrere Werte sind würde ich ebenfalls eine List nehmen, aber eigentlich erscheit mir Value ja als einzelnes Element, oder irre ich mich da?
oder meinst du Values oder Value[I]?
Help_Me - Fr 14.05.10 15:04
Nein, schon Value.
Range beinhaltet mehrere (Excel-)Zellen. Mit Value greife ich dann auf die einzelnen Werte der Zellen zu und lege sie dann in einem Array oder einer List ab.
Mitmischer 1703 - Fr 14.05.10 15:09
bin kein C#-Experte, aber müsstest du dann nicht mit einer Schleife und Value[I] arbeiten?
Denn mit
C#-Quelltext
1:
| Array array = (Array)myRange.Value; |
weist du deinem Array einen Wert zu, und dann würde dein Array die ganze Zeit von diesem Wert überschrieben...
Kha - Fr 14.05.10 15:20
Ah, immer noch Excel. Ja, dann ist es wahrscheinlich wirklich am günstigsten, das Array direkt in eine Liste einzulesen. Aber was haben bitte "seeehr große Datenmengen" in Excel zu suchen :eyecrazy: ?
Help_Me hat folgendes geschrieben : |
Mir ist nicht klar, wie ich die Werte meines Excel-Ranges in eine List bekomme. |
So viel gebe ich dir mal vor ;) .
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var rows = new List<object[]>();
Schleife 1... var row = new object[...]; Schleife 2... row aus Array füllen... rows.Add(row); |
Help_Me - Fr 14.05.10 15:27
Mitmischer 1703 hat folgendes geschrieben : |
bin kein C#-Experte, aber müsstest du dann nicht mit einer Schleife und Value[I] arbeiten? |
Nein, seltsamerweise nicht. Das hab ich so in einem Forum gefunden und übernommen. Und siehe da, es klappt.
Danke Kha!
Nur hier ist nun mein Problem mit den großen Datenmengen.
Wenn ich über
Array array = (Array)myRange.Value; meine Werte einlese, geht das flott.
Wenn ich das allerdings über zwei Schleifen mache, kostet das enorm Zeit. Und das war eigentlich auch der ausschlaggebende Grund, weswegen ich es eingelesen hab wie oben gepostet.
Sch***...was soll ich jetzt machen?
Kha - Fr 14.05.10 15:40
Help_Me hat folgendes geschrieben : |
Wenn ich über Array array = (Array)myRange.Value; meine Werte einlese, geht das flott.
Wenn ich das allerdings über zwei Schleifen mache, kostet das enorm Zeit. |
Wie kann das sein? Wenn du das Array aus Excel holst, muss die CLR es genauso neu erstellen und Feld für Feld befüllen, eigentlich sogar noch langsamer als es deine Schleifen schaffen sollten.
Erzähle doch mal ein wenig mehr über die eigentliche Aufgabe. Möglicherweise reicht es schon, die Zeilen gar nicht zu extrahieren, sondern sich lediglich den Index darauf zu merken?
Help_Me - Fr 14.05.10 15:49
Kha hat folgendes geschrieben : |
Erzähle doch mal ein wenig mehr über die eigentliche Aufgabe. Möglicherweise reicht es schon, die Zeilen gar nicht zu extrahieren, sondern sich lediglich den Index darauf zu merken? |
Dann mach ich das doch mal. Ist vermutlich am sinnvollsten.
Ich selektiere in Excel einen Bereich. In diesem Bereich kann es allerdings sein, dass die erste Zeile für die jew. Spalten die Überschrift beinhaltet. Derzeit darf ich noch von ausgehen, dass wenn die komplette erste Zeile aus Strings besteht, es sich um eine Überschriftenzeile handelt.
Handelt es sich bei der ersten Zeile um die Überschriften der jeweiligen Spalte, so darf ich diese Zeile im Grunde nicht gleich behandeln wie meinen restlichen Range, da dieser ja keine Überschriften beinhaltet, sondern Daten zum Weiterverarbeiten.
Im Grunde möchte ich also einen Range den ich bekomme aufteilen in Überschriften und restliche Daten.
Kha - Fr 14.05.10 16:33
Und wie sieht dieses Weiterverarbeiten aus? Warum dort nicht einfach die erste Zeile ignorieren?
Help_Me - Fr 14.05.10 18:58
Kha hat folgendes geschrieben : |
Und wie sieht dieses Weiterverarbeiten aus? Warum dort nicht einfach die erste Zeile ignorieren? |
Jap, so hatte ich es auch erst gemacht.
Soll ich aber anders lösen. Grund dafür ist, dass ich später eine Methode haben muss, die das Array komplett verwendet, sprich ohne Ignorieren der ersten Zeile die Daten des Arrays verwendet um sie später in eine DB zu schreiben.
Kha - Sa 15.05.10 13:03
Und du willst mir erzählen, dass das Auslesen aus Excel und Schreiben in eine DB kein Performance-Problem ist im Vergleich zum einfachen Kopieren eines Array-Teils in ein neues Array? Sorry, aber irgendwas stimmt hier hinten und vorne nicht ;) .
Help_Me - Sa 15.05.10 20:19
Okay, hab mich nochmal informiert. Keine DB, aber ein RecordSet. Macht das einen Unterschied??
Mhh...ich hab mit der Programmierung halt nur sehr wenig Erfahrung. Hab halt gemerkt, als ich Werte in ein Array über zwei for-Schleifen einlesen wollte, dass das sehr viel Zeit in Anspruch genommen hat. =/
Was würdest du dann empfehlen? Kann ich mit meinem Array arbeiten?
Ich würds gern mal mit einer List versuchen und mit einem Array, zum Vergleich.
Bei der List hast du mir ja schone ne gute Hilfestellung gegeben, das versuch ich mal morgen so umzusetzen.
Aber wie würde ich jetzt mein Array "kürzen", kannst du mir das noch kurz erläutern?
Gruß
Help_Me - So 16.05.10 19:49
Habs jetzt mal wie vorgeschlagen mit
List<object[]> gemacht.
Keine Ahnung was ich beim Array mit meinen For-Schleifen falsch gemacht hatte (hab die leider schon wieder gelöscht),
aber irgendwas konnte nicht stimmen, weil die Schleifen in der List funktionieren hervorragend (schnell), nicht so langsam wie bei meinem Array.
Noch zwei Fragen zur List. Bekomme ich das eleganter hin, dass die erste Zeile entfernt wird und jede Zeile um eins verschoben wird?
C#-Quelltext
1: 2: 3: 4: 5:
| list[0] = null; for (int i = 1; i < list.Count; i++) { list[i - 1] = list[i]; } |
2.
Ist jetzt weniger wichtig, aber wäre nicht schlecht wenn es irgendwie geht. Meine List ist immer gleich lang.
Bisher greife ich mit einem Index auf ein beliebiges Array in meiner List zu und ermittle dann über
Length die Anzahl der Elemente pro Array in meiner List.
Gibts ne Möglichkeit das ohne Index zu machen?
JüTho - So 16.05.10 20:02
Zu 1. Nachschauen in der SDK-Doku/MSDN/Hilfe zeigt, dass es eine Methode mit folgender Bedeutung gibt:
Zitat: |
Removes the element at the specified index of the List<(Of <(T>)>). |
Jürgen
Help_Me - So 16.05.10 20:16
Sorry, hab RemoveAt gerade selbst gefunden. War zu voreilig... =/
Meine zweite Frage besteht noch, wär super falls es dazu noch ne Lösung gibt.
Kha - So 16.05.10 20:34
Help_Me hat folgendes geschrieben : |
Gibts ne Möglichkeit das ohne Index zu machen? |
Nein. Woher soll die List wissen, dass alle Arrays in ihr die gleiche Länge haben? Und warum stört dich das überhaupt?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!