Generisches IEnumerable(Of T).Sum

    • VB.NET

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

      Generisches IEnumerable(Of T).Sum

      Hallo Community.

      Ich hatte gerade das Problem, dass ich Elemente aus einem Array miteinander addieren wollte. Ich wollte dafür die von IEnumerable geerbte Funktion Sum verwenden. Jedoch musste ich feststellen, dass diese als Rückgabetypen nur die grundlegenden numerischen Datentypen zulässt, nicht jedoch den Typ T des IEnumerables. Da ich an der Stelle aber keine Schleife haben wollte hab ich mir dafür eine kleine Extension geschrieben, von der ich denke, dass sie vielleicht auch jemand anderem nützlich sein könnte. Hier der Code:

      VB.NET-Quellcode

      1. Public Module ExtendEnumerableSum
      2. <Extension()>
      3. Public Function Sum(Of T)(e As IEnumerable(Of T), accumulator As Func(Of T, T, T)) As T
      4. Dim item = e.First
      5. For Each i In e.Skip(1)
      6. item = accumulator(item, i)
      7. Next
      8. Return item
      9. End Function
      10. End Module

      Die Funktion nimmt das erste Item der Auflistung und wendet dann den übergebenen Delegaten in Kombination mit dem nächsten Element darauf an usw.. Der erhaltene Wert wird in die Variable zurückgeschrieben, sodass sich die errechneten Werte summieren (wer hätte es gedacht). Der Additionsvorgang muss hierbei im Delegaten stattfinden, da die Funktion mit unbekannten Typen arbeitet (im Gegensatz zu den anderen Sum-Funktionen).

      Eine Beispielanwendung mit einem selbst definierten Datentypen:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      3. Dim l As New List(Of TestStruct)({New TestStruct With {.TestValue = 10}, New TestStruct With {.TestValue = 5}})
      4. Debug.Print(l.Sum(AddressOf TestStruct.op_Addition).TestValue.ToString)
      5. End Sub
      6. End Class
      7. Public Structure TestStruct
      8. Public TestValue As Integer
      9. Public Shared Operator +(struct1 As TestStruct, struct2 As TestStruct) As TestStruct
      10. Return New TestStruct With {.TestValue = struct1.TestValue + struct2.TestValue}
      11. End Operator
      12. End Structure


      Edit:
      Wie sich herausgestellt hat gab es diese Funktion bereits, sie heißt Aggregate. Ich lass den Code dennoch mal hier drin, vielleicht kanns ja jemand in irgend ner Weise gebrauchen.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Artentus“ ()

      ~blaze~ schrieb:

      Wäre aber nicht die Aggregate-Extension genau das, was du brauchst?
      Potzblitz! - so isses:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      2. Dim l As New List(Of TestStruct)({New TestStruct With {.TestValue = 10}, New TestStruct With {.TestValue = 15}, New TestStruct With {.TestValue = 5}})
      3. Debug.Print(l.Sum(AddressOf TestStruct.op_Addition).TestValue.ToString)
      4. Debug.Print(l.Aggregate(AddressOf TestStruct.op_Addition).TestValue.ToString)
      5. End Sub
      6. End Class

      @TE: Du hast das Rad neu erfunden! :thumbsup: