Im Namespace 'System.Linq' ist die Klasse 'Enumerable' enthalten, die die 'Average'-Methode zur verfügung stellt. Diese Methode berechnet den Durchschnitt einer Datensequenz, die z.B. in einem Array enthalten sein kann. 'Average' summiert offenbar die Werte der Datenreihe zunächst auf und führt danach die Division durch. Aus diesem Grund kann es zu einer Überschreitung des größtmöglichen Datentyp-Wertes (bzw. zu einer Unterschreitung des kleinstmöglichen Datentyp-Wertes) kommen. Bei den IEEE-Datentypen 'Single' und 'Double' wird in diesem Fall statt des Mittelwertes der (normalerweise sinnlose) Wert (+/-)'Infinity' zurückgegeben. Eine Ausnahme wird nicht ausgelöst. Bei den Ganzzahl-Datentypen 'Integer' und 'Long' wird zwar ein Double-Wert zurückgegeben, die berechnete Summe muß aber im Bereich des Datentyps 'Long' liegen, sonst wird eine Ausnahme ausgelöst (OverflowException). Bei dem Datentyp 'Decimal' muss die Summe innerhalb der Grenzen dieses Typs liegen, sonst wird eine Ausnahme ausgelöst. Um das Risiko der 'OverflowException' auszuschalten, kann man statt dessen die Methode 'Sum' verwenden und eine 'Transformationsfunktion' angeben, die dafür sorgt, dass die dividierten Elemente der Auflistung summiert werden. Dabei muss ein geringfügiger Verlust an Genauigkeit des berechneten Mittelwertes in Kauf genommen werden. Option Strict On Option Explicit On Option Infer Off Imports System.Linq.Enumerable Public Module modDemo_Average_Sum Public Sub Ex_Average_Sum() ' 3 Arrays mit großen Zahlen füllen Dim dec_arr(4) As Decimal, lng_arr(4) As Long, dbl_arr(4) As Double For i As Integer = 0 To dec_arr.Length - 1 dec_arr(i) = Decimal.MaxValue / 3 lng_arr(i) = Long.MaxValue \ 3 dbl_arr(i) = Double.MaxValue / 3 Next i ' Beispiel 1: Array-Erweiterungsmethode ' ===================================== ' Überlauf Summe > Decimal.MaxValue Dim dec_av1 As Decimal ' = dec_arr.Average() ' Überlauf Summe > Long.MaxValue Dim lng_av1 As Double ' = lng_arr.Average ' Statt Überlauf: Double.PositiveInfinity Dim dbl_av1 As Double = dbl_arr.Average ' Erweiterungsmethode 'Sum' bei Division der Elemente Dim dec_av2 As Decimal = _ dec_arr.Sum(Function(number) number / dec_arr.Length) Dim lng_av2 As Double = _ lng_arr.Sum(Function(number As Long) number / lng_arr.Length) Dim dbl_av2 As Double = _ dbl_arr.Sum(Function(number) number / dbl_arr.Length) ' Beispiel 2: Linq-Aggregate ' ========================== ' Überlauf Summe > Decimal.MaxValue Dim dec_av3 As Decimal = _ Aggregate x As Decimal In dec_arr Into Average() ' Überlauf Summe > Long.MaxValue Dim lng_av3 As Double = _ Aggregate x As Long In lng_arr Into Average() ' Überlauf Summe > Long.MaxValue Dim dbl_av3 As Double = _ Aggregate x As Double In dbl_arr Into Average() ' Aggregate-Methode 'Sum' bei Division der Elemente Dim dec_av4 As Decimal = _ Aggregate x As Decimal In dec_arr Into Sum(x / dec_arr.Length) Dim lng_av4 As Double = _ Aggregate x As Long In lng_arr Into Sum(CDbl(x / lng_arr.Length)) Dim dbl_av4 As Double = _ Aggregate x As Double In dbl_arr Into Sum(x / dbl_arr.Length) End Sub End Module Dieser Tipp wurde bereits 8.981 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Tipp des Monats September 2024 Dieter Otter Übergabeparameter: String oder Array? Mit der IsArray-Funktion lässt sich prüfen, ob es sich bei einem Übergabeparameter an eine Prozedur um ein Array oder einer "einfachen" Variable handelt. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |