Laden...

Maximal Wert einer ObservableCollection<Tuple<int, int, double>> herausfinden

Erstellt von Kleinstein11 vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.765 Views
K
Kleinstein11 Themenstarter:in
21 Beiträge seit 2017
vor 6 Jahren
Maximal Wert einer ObservableCollection<Tuple<int, int, double>> herausfinden

Hallo zusammen,

Ich habe eine ObservableCollection<Tuple<int, int, double>>data mit Messwerten.

Nun möchte ich den Maximalwert aller double Werte herausfinden und den dazu gehörigen Tuple herausbekommen.

Meine vorgehensweise:

private Tuple<int, int, double> Maxima()
        {
             GetData _getdata = new GetData(data);
             Tuple<int, int, double> _maxima;

             for(int i = 0; i <= this.data.Count; i++)
             {
                 if (data[i].Item3 > data[i - 1].Item3)
                 {
                      _maxima=data[i];
                 }
             }
            return _maxima;
        } 

Allerdings meckert der Compiler dass return_maxima sei eine nicht zugewiesene lokale variable.

ich kann das return ja nicht in die for Schleife setzten da erst alle Indexes der data Liste durchlaufen werden muss. Gibt es eine einfachere Lösung vielleicht ??

Vielen Dank im Voraus.

6.911 Beiträge seit 2009
vor 6 Jahren

Hallo Kleinstein11,

Tuple<int, int, double> _maxima = null;

Das ≤ in der Schleifenbedinung passt auch nicht bzw. der Start bei i = 0 wenn du dann mit [i - 1] indizierst. Schau dir die Grundlagen noch einmal genauer an.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

16.835 Beiträge seit 2008
vor 6 Jahren

Hinweis: Variablen in Methoden sollten nicht mit _ beginnen. Die C# Guidelines sieht das für Felder vor.
zB sollte Dein "data" eigentlich "_data" heissten (ich gehe davon aus, "data" ist ein Feld bei Dir).
[Artikel] C#: Richtlinien für die Namensvergabe

Dein Code garantiert nicht, dass _maxima irgendein Wert erhält.
Angenommen this.data ist leer, dann wäre _maxima immer noch im nicht initialisierten Zustand.
Daher der Compiler Fehler.

K
Kleinstein11 Themenstarter:in
21 Beiträge seit 2017
vor 6 Jahren

Perfekt Vielen dank. Ich dachte dass bei einer Deklaration falls nichts angegeben automatisch null gesetzt wird.

Ich muss nur < verwenden denke ich oder?

D
985 Beiträge seit 2014
vor 6 Jahren

Da stecken aber noch mehr Fehler drin.

Da wird auf einen negativen Index zugegriffen und der Maximalwert wird auch nicht bestimmt, da immer nur der aktuelle Eintrag mit dem vorherigen Eintrag verglichen wird.

Mit LINQ würde es so aussehen


return data.OrderByDescending( e => e.Item3 ).FirstOrDefault();

K
Kleinstein11 Themenstarter:in
21 Beiträge seit 2017
vor 6 Jahren

Perfekt vielen Dank. genau dass habe ich zuvor nicht hinbekommen 😃

M
368 Beiträge seit 2006
vor 6 Jahren

Daneben enthält das .NET Framework eine Math.Max-Methode: https://msdn.microsoft.com/de-de/library/7x97k0y4(v=vs.110).aspx
Ein Array-Beispiel mit VB.NET: https://www.dotnetperls.com/math-max-min-vbnet

Eine "Zu-Fuss-Methode" ohne LINQ oder Math.Max:
-das erste Element des Arrays ist erstmal das Maximum
-danach das Array durchlaufen und vergleichen, ob sich ein grösserer Wert findet
-wenn ja, wird dieses neue Ergebnis zum Maximum
-am Ende dann das Maximum zurückgeben lassen

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉