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.823 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. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
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. |