Autor |
Beitrag |
Microvilli
Hält's aus hier
Beiträge: 10
|
Verfasst: So 18.03.18 12:45
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
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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.
Zuletzt bearbeitet von jfheins am So 18.03.18 23:17, insgesamt 1-mal bearbeitet
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 18.03.18 13:07
Es sind auch nur neun Listen
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Microvilli
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
Hält's aus hier
Beiträge: 10
|
Verfasst: 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.
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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
|
|