Rubrik: Variablen/Strings · Algorithmen/Mathematik | VB-Versionen: VB2005, VB2008, VB2010 | 04.04.11 |
Arithmetik mit Feldern und/oder Konstanten Eine Funktion, mit der man zwei Felder oder ein Feld mit einer Konstanten arithmetisch verknüpfen kann, will heißen: Anwenden der vier Grundrechenarten. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 8.476 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Die folgende Funktion erlaubt das 'Rechnen' mit Feldern und Konstanten. Als Parameter kann man entweder zwei Felder, deren stellungsbezogene Elemente mit einer der vier Grundrechenarten verknüpft werden sollen, oder ein Feld, dss mit einer Konstanten 'verrechnet' werden soll, angeben. Dabei heißt 'stellungsbezogen', dass das Element mit Index x des ersten Feldes mit dem Element mit Index x des zweiten Feldes verknüpft wird (das setzt voraus, dass die Felder möglichst gleich dimensioniert sein müssen).
Wenn man arr2 nicht angibt, erwartet die Funktion, dass mit einer Konstanten gerechnet werden soll. Es können auch Felder angegeben werden, die aus gemischten Typen von Elementen bestehen. Es werden nur Elemente für die Berechnung verwendet die vom Typ so zu sagen 'numerisch' sind. Im Feld der Ausnahmetypen sind diejenigen Datentypen angegeben, die nicht 'verrechnet' werden können. Wenn das der Fall ist, sind unten im Funktionscode Möglichkeiten angegeben, wie man verfahren, um das Ergebnisfeld zu füllen.
Die Funktion:
''' <summary> ''' Elemente zweier Arrays mit arithmetischer Operation verknüpfen ''' </summary> ''' <param name="arithArt">die Operation als String ("+", "-", "*", "/")</param> ''' <param name="arr1">das erste Array</param> ''' <param name="arr2">das zweite Array</param> ''' <param name="idx1">Anfangsindex</param> ''' <param name="idx2">Endeindex</param> ''' <param name="constante">eine Konstante</param> ''' <returns>das Ergebnis-Array</returns> ''' <remarks> ''' Das zweite Array muss bei Subtraktion die Subtrahenden-, ''' bei Division die Divisoren-Elemente enthalten. ''' Wird ein zweites Array nicht angegeben, wird erwartet, ''' dass mit einer Konstanten gerechnet wird. ''' Es werden alle Elemente anhand der Ausnahmetypen überprüft, ob sie numerische Elemente sind, ''' wenn nicht, wird als Ergebniselement 0 gespeichert. ''' </remarks> Public Function arithArrays(ByVal arithArt As String, _ ByVal arr1 As Array, Optional ByVal arr2 As Array = Nothing, _ Optional ByVal idx1 As Short = 0, Optional ByVal idx2 As Short = 0, _ Optional ByVal constante As Object = 1) As Array ' Ausnahmetypen Dim types() As Type = _ {GetType(Boolean), GetType(Byte), GetType(Char), _ GetType(DateTime), GetType(Object), GetType(String)} Dim ty1, ty2 As Type, value As Object ' Ausgabe-Array ' das erste Feld bestimmt die Dimension des Ausgabefelds Dim tmpArr(arr1.Length - 1) As Object Dim lastIdx As Short = idx2 If idx2 = 0 Then lastIdx = arr1.Length - 1 For i As Short = idx1 To lastIdx ' Rechnen mit zwei Feldern If Not IsNothing(arr2) Then If IsDBNull(arr1(i)) OrElse IsDBNull(arr2(i)) Then Continue For ty1 = arr1(i).GetType : ty2 = arr2(i).GetType If types.IndexOf(types, ty1) >= 0 OrElse types.IndexOf(types, ty2) >= 0 Then ' Arrayelement war nicht numerisch (könnte auch DBNull oder Nothing o.ä. gesetzt werden) tmpArr(i) = 0 Continue For End If value = arr2(i) ' Rechnen mit Konstante Else If types.IndexOf(types, ty1) >= 0 Then ' Arrayelement war nicht numerisch, dann Ergebniselement = Originalelement tmpArr(i) = arr1(i) Continue For End If value = constante End If Select Case arithArt Case "+" ' Addition tmpArr(i) = arr1(i) + value Case "-" ' Subtraktion tmpArr(i) = arr1(i) - value Case "*" ' Multiplikation tmpArr(i) = arr1(i) * value Case "/" ' Division If value = 0 Then ' wenn Divisorelement oder constante =0, dann Ergebniselement =0 ' (könnte auch =DBNull oder =Nothing oder =Originalelement von arr1 o.ä. gesetzt werden) tmpArr(i) = 0 Else tmpArr(i) = arr1(i) / value End If End Select Next Return tmpArr End Function
Aufrufbeispiel zwei Felder:
(Differenz zweier Datenzeilen einer Datentabelle, beginnend ab Index 1)
Dim dr1, dr2 As DataRow Dim diff As Array = arithArrays("-", dr2.ItemArray, dr1.ItemArray, 1)
Aufrufbeispiel rechnen mit Konstanter:
(alle Werte eines gebundenen DGV-Datensatzes durch 1000 dividieren)
Dim drj() As Object drj = DatagridView1.Rows(0).DataBoundItem.Row.ItemArray drj = arithArrays("/", drj, , , , 1000)