Autor |
Beitrag |
Help_Me
      
Beiträge: 31
|
Verfasst: Do 13.05.10 14:50
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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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.
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
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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.
_________________ Die Lösung ist nicht siebzehn.
|
|
Help_Me 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Fr 14.05.10 15:01
_________________ Die Lösung ist nicht siebzehn.
|
|
Help_Me 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: 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...
_________________ Die Lösung ist nicht siebzehn.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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  ?
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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 14.05.10 16:33
Und wie sieht dieses Weiterverarbeiten aus? Warum dort nicht einfach die erste Zeile ignorieren?
_________________ >λ=
|
|
Help_Me 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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ß
|
|