116 lines
4.3 KiB
C#
116 lines
4.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Project_Periodensystem.Model;
|
|
|
|
namespace Project_Periodensystem.Controller
|
|
{
|
|
/// <summary>
|
|
/// ElementStatistics - Spezialisierte Klasse für statistische Berechnungen und Datenanalyse
|
|
///
|
|
/// Diese Klasse wurde aus dem Haupt-Controller ausgelagert, um das Single Responsibility
|
|
/// Principle zu befolgen. Sie konzentriert sich ausschließlich auf:
|
|
///
|
|
/// - Mathematische Berechnungen (Durchschnitte, Extreme)
|
|
/// - Datengruppierung und -analyse (Serien, Kategorien)
|
|
/// - Informationsextraktion (Tuple-basierte Abfragen)
|
|
/// - Performance-optimierte LINQ-Operationen
|
|
///
|
|
/// Vorteile der Auslagerung:
|
|
/// - Bessere Testbarkeit einzelner Berechnungen
|
|
/// - Wiederverwendbarkeit der Statistik-Funktionen
|
|
/// - Klare Trennung von UI-Logik und Datenverarbeitung
|
|
/// - Einfache Erweiterung um neue Statistiken
|
|
/// </summary>
|
|
public class ElementStatistics
|
|
{
|
|
/// <summary>
|
|
/// Private, schreibgeschützte Liste aller Elemente für statistische Berechnungen.
|
|
/// Wird im Konstruktor gesetzt und bleibt danach unveränderlich (readonly).
|
|
/// Garantiert Datenintegrität während der gesamten Lebensdauer des Objekts.
|
|
/// </summary>
|
|
private readonly List<Element> _elements;
|
|
|
|
/// <summary>
|
|
/// Konstruktor der ElementStatistics-Klasse.
|
|
/// Initialisiert die Statistik-Engine mit einer Element-Sammlung.
|
|
///
|
|
/// Design-Prinzipien:
|
|
/// - Dependency Injection: Element-Liste wird von außen bereitgestellt
|
|
/// - Defensive Programmierung: Null-Safety durch Fallback
|
|
/// - Unveränderlichkeit: readonly field für Datensicherheit
|
|
/// </summary>
|
|
/// <param name="elements">Liste der Elemente für statistische Auswertungen (kann null sein)</param>
|
|
public ElementStatistics(List<Element> elements)
|
|
{
|
|
// Null-Safety: Falls null übergeben wird, erstelle eine leere Liste
|
|
// Verhindert NullReferenceExceptions in allen nachfolgenden Methoden
|
|
_elements = elements ?? new List<Element>();
|
|
}
|
|
|
|
public double[] GetAtomicWeights()
|
|
{
|
|
double[] weights = new double[_elements.Count];
|
|
for (int i = 0; i < _elements.Count; i++)
|
|
{
|
|
weights[i] = _elements[i].AtomicWeight;
|
|
}
|
|
return weights;
|
|
}
|
|
|
|
public double GetAverageAtomicWeight()
|
|
{
|
|
if (!_elements.Any()) return 0.0;
|
|
|
|
double[] weights = GetAtomicWeights();
|
|
double sum = 0;
|
|
for (int i = 0; i < weights.Length; i++)
|
|
{
|
|
sum += weights[i];
|
|
}
|
|
return sum / weights.Length;
|
|
}
|
|
|
|
public List<string> GetAllSeries()
|
|
{
|
|
return _elements.Select(e => e.Series)
|
|
.Distinct()
|
|
.Where(s => !string.IsNullOrWhiteSpace(s))
|
|
.OrderBy(s => s)
|
|
.ToList();
|
|
}
|
|
|
|
public (int totalElements, int uniqueSeries, double avgWeight) GetStatistics()
|
|
{
|
|
var seriesCount = GetAllSeries().Count;
|
|
var avgWeight = GetAverageAtomicWeight();
|
|
|
|
return (_elements.Count, seriesCount, avgWeight);
|
|
}
|
|
|
|
public (Element? lightest, Element? heaviest) GetWeightExtremes()
|
|
{
|
|
if (!_elements.Any()) return (null, null);
|
|
|
|
var lightest = _elements.OrderBy(e => e.AtomicWeight).First();
|
|
var heaviest = _elements.OrderByDescending(e => e.AtomicWeight).First();
|
|
|
|
return (lightest, heaviest);
|
|
}
|
|
|
|
public (string symbol, string name, double weight) GetElementInfo(int atomicNumber)
|
|
{
|
|
var element = _elements.FirstOrDefault(e => e.AtomicNumber == atomicNumber);
|
|
return element != null
|
|
? (element.Symbol, element.ElementName, element.AtomicWeight)
|
|
: ("?", "Unknown", 0.0);
|
|
}
|
|
|
|
public (int row, int column) GetElementPosition(int atomicNumber)
|
|
{
|
|
var element = _elements.FirstOrDefault(e => e.AtomicNumber == atomicNumber);
|
|
return element != null ? (element.Row, element.Column) : (-1, -1);
|
|
}
|
|
}
|
|
}
|