Entwickler-Ecke
Basistechnologien - Dynamische Erstellung von Listen
Microvilli - So 18.03.18 12:45
Titel: Dynamische Erstellung von Listen
Liebe Forumgemeinde,
ich hoffe ihr könnt mir weiterhelfen.
Ich möchte je nach Benutzereingabe in Laufzeit eine bestimmte Anzahl von Listen erstellen.
Hier mal der von mir überlegte Code, geht nur leider nicht. Später sollen in die Listen Excel Daten importiert werden.
Angenommen der Benutzer will 10 Listen ertsellen:
C#-Quelltext
1: 2: 3: 4: 5:
| for (int i = 1; i < 10; i++) { List<double> i = new List<double>(); } |
Wie komme ich alternativ an mein Ziel?
Vielen Dank und beste Grüße,
ProgrammierNeuling
Moderiert von Christian S.: C#-Tags hinzugefügtModeriert von Th69: Topic aus C# - Die Sprache verschoben am So 18.03.2018 um 12:51
jfheins - So 18.03.18 12:56
Du erstellt da schon
10 ein paar Listen, aber du speichert sie dann nicht.
Die Variable i wird ja immer überschrieben.
Du kannst allerdings eine Liste von Listen anlegen:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| var listlist = new List<List<double>>();
for (int i = 1; i < 10; i++) { listlist.Add(new List<double>()); } |
Ob das sinnvoll ist, hängt davon ab, was du damit anfangen willst.
Christian S. - So 18.03.18 13:07
Es sind auch nur neun Listen ;-)
Microvilli - So 18.03.18 14:46
Danke für die schnellen Antworten.
Wie kann ich bei deinem Code dann auf die Listen in der Liste zugreifen, wenn ich das richtig sehe, sind die ja nicht benannt?
ich möchte jede Liste aufrufen können und über .Add Werte aus Excel hinzufügen.
Am Ende möchte ich eine Anzahl x Listen erstellen. X wird durch Eingabe vom Benutzer festgelegt. Die Listen sollen benannt werden nach Zeile1, Zeile2.....ZeileX.
Ralf Jansen - So 18.03.18 14:48
Um das richtige zu empfehlen wäre es für uns hilfreich zu wissen was die Listen darstellen sollen wenn sie etwas bestimmtes darstellen und nicht einfach nur beliebige Daten.
Und dann wäre interessant zu wissen wie diese Listen den in Excel dargestellt werden sollen. Zeilen oder Spalten oder nichts davon?
Microvilli - So 18.03.18 16:10
ok, dann schreibe ich einfach mal das vollständige Ziel:
Ich möchte Excel Files auswerten die Graphen beinhalten:
In einer Zeile stehen die X-Werte (Zeit)
In anderen Zeilen jeweils die Y-Werte (Messwerte)
Ich möchte die Werte importieren und dann die Steigung bestimmen. Allerdings nur den linearen Bereich der Steigung, meist besitzen die Graphen nach einer bestimmten Zeit ein "Plateau". Ich möchte nur den anfänglichen linearen Bereich haben. Wann das Plateau kommt ist bei jeder Messung verschieden, teilweise verlaufen die Graphen auch über die ganze Zeit linear. Öfter ist der Anfangsbereich der Messung fehlerhaft, das muss auch berücksichtigt werden.
Ich habe mir folgendes Konzept überlegt:
1. Werte aus Excel in C# importieren und in Listen speichern (deshalb die Frage oben)
- Liste 1 (X-Werte)
-Liste 2 (Y Werte1)
-Liste 3 (Y Werte2)
-Liste i (Y Wertei) Anzahl der Messungen (i) varrieren von Benutzer zu Benutzen, sowie die Anzahl der Messwerte auf der x-Achse
2. Steigungen von Messpunkt zu Messpunkt erzeugen und erneut in eine Liste speichern
-Liste S2
-Liste S3
-Liste Si
3. Die Steigungen in den Listen nach der Größe sortieren, dann wären die ersten Werte der Liste der lineare Bereich, davon nehme ich nur noch den Mittelwert und will den in der Konsole ausgeben lassen
Das Konzept wäre immer noch fehleranfällig, aber zumindest erstmal ein Anfang. Was denkt ihr?
Ralf Jansen - So 18.03.18 21:08
Du bekommst also viele Exceldateien als Input die jeweils aus Zeitpunkt Messwert Paaren bestehen?
Und du möchtest Zeitpunkt und Messwert unabhängig in eigenen Listen speichern?
Dan habe ich noch nicht verstanden
a.) Sind in den verschiedenen Quellen die gleichen Zeitpunkt drin so das es reicht eine Liste mit Zeitpunkten für alle Messwert Listen zu haben
b.) Gibt es irgendeinen Zusammenhang zwischen den Daten aus den verschiedenen Quellen? Deine Erklärung hört sich für mich so an als möchtest du, zumindest im ersten Schritt, nur die Steigungen der Messwert aus einer Quelle bestimmen unabhängig von den anderen Daten und später erst vergleichen.
Microvilli - Di 20.03.18 22:37
Danke für deine Antwort, entschuldig meine späte...
Ich möchte nur eine Exceldatei auswerten, diese besitzt einmal Werte (Zeitpunkte) für die x-Achse und viele Werte (Messdaten) für die y-Achsen, die sich aber alle auf die eine X-Achse beziehen.
Die eine x-Achse wollte ich in Liste 1 speichern. Die Y-Achsen in jeweils einer Liste pr y-Achse, da die Anzahl der Y-Achsen variiert, möchte ich hierfür die Anzahl der Listen "dynamisch" halten.
Der Benutzer soll dann in die Konsole eingeben, wieviele Messungen (y-Achsen) er hat, danach wird die Anzahl der Listen festgelegt. Das sollte doch möglich sein, oder?
lapadula - Mo 26.03.18 19:51
Vllt hilft dir das weiter:
Ein Dictionary der als Key einen String hat und zu jedem Key gibt es eine Liste.
Die Listen bekommen durch den Key einen Namen und können dann angesprochen werden.
Der Name ist in diesem Fall der Zähler i als String
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Dictionary<string, List<int>> ListDict = new Dictionary<string, List<int>>();
for (int i = 0; i < 10; i++) { ListDict.Add(i.ToString(), new List<int>()); }
ListDict["0"].Add(3);
MessageBox.Show(ListDict["0"][0].ToString()); |
Moderiert von Th69: Code- durch C#-Tags ersetzt
Microvilli - Do 29.03.18 20:57
Danke für den Tipp, das wäre genau das was ich suche, aber ein Problem ist da noch, ich möchte die Liste über einer Variable ansprechen können, also wie in dem Beispielcode unten, ist das auch möglich?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Dictionary<string, List<int>> ListDict = new Dictionary<string, List<int>>();
for (int i = 0; i < 10; i++) { ListDict.Add(i.ToString(), new List<int>()); }
int j = 1
ListDict["j"].Add(3);
MessageBox.Show(ListDict["j"][0].ToString()); |
Ich hoffe es ist verständlich was ich meine
Viele Grüße
Moderiert von Christian S.: C#-Tags hinzugefügt
Th69 - Fr 30.03.18 11:48
Auf die Listen kannst du einfach per Index zugreifen, daher sehe ich hier keine Notwendigkeit für ein
Dictionary:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var lists = new List<List<double>>();
for (int i = 0; i < 10; i++) { lists.Add(new List<double>()); }
for (int i = 0; i < 10; i++) { var list = lists[i]; } |
Ein
Dictionary macht nur bei einzeln benannten Werten oder nicht fortlaufenden Zahlen Sinn.
lapadula - Fr 30.03.18 12:44
Microvilli hat folgendes geschrieben : |
Danke für den Tipp, das wäre genau das was ich suche, aber ein Problem ist da noch, ich möchte die Liste über einer Variable ansprechen können, also wie in dem Beispielcode unten, ist das auch möglich?
|
Ich versteh nicht ganz was du vorhast. Warum möchtest du die Liste in eine Variable packen? Du kannst die Liste doch schon ansprechen über den Namen, nur das du dabei auch das Dictionary erwähnen musst.
Microvilli - Di 03.04.18 10:52
Vielen Dank lapadula und Th69, danach habe ich gesucht, so ganz sicher bin ich mir auch noch nicht wie das am Ende aussehen soll :)
Ich schreibe hier den Code, wenn ich fertig bin, kann allerdings noch eine Weile dauern ;)
Microvilli - Mi 04.04.18 16:05
Hier der Code, damit möchte ich Excel Werte einlesen und in listen abspeichern. Wie groß i und b werden darf, wird durch Eingabe in die Konsole festgelegt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Office.Interop.Excel; using _Excel = Microsoft.Office.Interop.Excel;
{ class Program { static void Main(string[] args) { Excel excel = new Excel(@"C:\Users\......", 1); var lists = new List<List<double>>();
for (int i = 1; i < 10; i++) { lists.Add(new List<double>()); }
int a = 36; int b = 1;
while (b < 22) { lists[1].Add(excel.ReadCell(a, b)); b++; }
for (int i = 2; i < 10; i++) { a = 36 + i; b = 1; while (b < 22) { lists[i].Add(excel.ReadCell(a, b)); b++; } }
foreach (double number in lists[3]) { Console.WriteLine(number); } Console.ReadKey(); } }
class Excel { string path = ""; _Application excel = new _Excel.Application(); Workbook wb; Worksheet ws; public Excel(string path, int Sheet) { this.path = path; wb = excel.Workbooks.Open(path); ws = wb.Worksheets[Sheet]; }
public double ReadCell(int i, int j) { i++; j++; if (ws.Cells[i, j].Value2 != null) return ws.Cells[i, j].Value2; else return 0; } } } |
Leider bekomme ich die Fehlermeldung "Argument out of Range Exception". Ich vertsehe absolut nicht warum :( habt ihr eine Idee?
Moderiert von Christian S.: C#-Tags hinzugefügt
Ralf Jansen - Mi 04.04.18 16:33
Beim Debuggen sollte dir Visual Studio nicht nur sagen das eine Exception aufgetreten ist sondern auch wo. Dieses wo sollte dir schon entscheidend weiterhelfen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 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!