Autor Beitrag
Microvilli
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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:

ausblenden 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 user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am So 18.03.2018 um 12:51
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 865
Erhaltene Danke: 143

Win7
VS 2013, VS2015
BeitragVerfasst: 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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20334
Erhaltene Danke: 2118

Win 10
C# (VS 2017)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4420
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4420
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170
Erhaltene Danke: 10



BeitragVerfasst: 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

ausblenden 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>());
}

//So fügst du der Liste "0" einen Wert zu 
ListDict["0"].Add(3);

// Und so kannst du den wieder ausgeben
MessageBox.Show(ListDict["0"][0].ToString());


Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Microvilli Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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?

ausblenden 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

//So fügst du der Liste "0" einen Wert zu 
ListDict["j"].Add(3);

// Und so kannst du den wieder ausgeben
MessageBox.Show(ListDict["j"][0].ToString());


Ich hoffe es ist verständlich was ich meine

Viele Grüße

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3995
Erhaltene Danke: 820

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170
Erhaltene Danke: 10



BeitragVerfasst: Fr 30.03.18 12:44 
user profile iconMicrovilli hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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.

ausblenden volle Höhe 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 user profile iconChristian S.: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4420
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.