Extensions für Listen

    • VB.NET

      Extensions für Listen

      Hier ein paar praktische Extensions, mit denen man sich den Umgang mit IEnumerable(Of T) noch bisserl erleichtern kann.
      IEnumerable(Of T) ist die Schnittstelle, die hinter der For Each-Schleife steht, aber auch hinter allem, was Linq an Verarbeitung für Auflistungen so zu bieten hat.
      Einziger Member dieser Schnittstelle ist GetEnumerator, was ein IEnumerator(Of T)-Objekt zurückgibt.
      So ein Enumerator ist eine Umsetzung des Iterator-Patterns (alias "Besucher-Pattern"), und verfügt über die Member:
      • .Reset(): zurück zum Ausgangszustand
      • .MoveNext() As Boolean: Versuche, zum nächsten zu gehen - falls das nicht geht, returne False
      • .Current As T: returne den Wert des aktuellen Items
      • .Dispose(): Resourcen freigeben
      Die Extensions

      VB.NET-Quellcode

      1. Imports System.Runtime.CompilerServices
      2. Namespace System.Collections.Generic
      3. <HideModuleName()> _
      4. Public Module CollectionX
      5. ''' <summary>executes the action for each item</summary>
      6. <DebuggerStepThrough(), Extension()> _
      7. Public Sub ForEach(Of T)(ByVal itms As IEnumerable(Of T), ByVal Action As Action(Of T))
      8. For Each itm In itms : Action(itm) : Next
      9. End Sub
      10. ''' <summary>returns the **typisized** Enumerator of the array</summary>
      11. <Extension(), DebuggerStepThrough()> _
      12. Public Function GetEnumeratorX(Of T)(ByVal arr As T()) As IEnumerator(Of T)
      13. Return DirectCast(arr, IList(Of T)).GetEnumerator
      14. End Function
      15. ''' <summary>returns the next item. Exception on empty collection</summary>
      16. <DebuggerStepThrough(), Extension()> _
      17. Public Function YieldCyclic(Of T)(ByVal enrt As IEnumerator(Of T)) As T
      18. With enrt
      19. If .MoveNext Then Return .Current
      20. .Reset() : .MoveNext() : Return .Current
      21. End With
      22. End Function
      23. ''' <summary>returns the next item. Exception when collection exhaustet</summary>
      24. <DebuggerStepThrough(), Extension()> _
      25. Public Function Yield(Of T)(ByVal enrt As IEnumerator(Of T)) As T
      26. enrt.MoveNext()
      27. Return enrt.Current
      28. End Function
      29. End Module
      30. End Namespace
      • .ForEach(action): Damit kann man einzeilige ForEach-Schleifen formulieren, was bei trivialen Schleifen die Lesbarkeit bisserl erhöht.
      • .GetEnumeratorX (): Ein Workaround, weil leider gibt die Standard-Array.GetEnumerator() - Methode den untypisierten Enumerator zurück, wo doch der typisierte viel nützlicher ist.
      • .YieldCyclic(): eine Zusammenfassung von Enumerator.MoveNext und Enumerator.Current. Am Ende der Enumeration wird der Enumerator einfach resetted, und's geht von vorne los :D
      • .Yield(): wie .YieldCyclic(), nur hinter dem Ende der Enumeration gibts eine Exception statt eines Neu-Beginns.


      So, jetzt aber der lustige Code aussm Form, wo das alles in wahrhaft minimalistischer Form verbaut ist:

      VB.NET-Quellcode

      1. Public Class frmEnumeratorExtensions
      2. Private _Images As IEnumerator(Of Bitmap) = {My.Resources.Colors, My.Resources.BattleOfShanghaiBaby, My.Resources.du_bist_faul, My.Resources.nevermore}.GetEnumeratorX
      3. Private _Colors As IEnumerator(Of Color) = {Color.Red, Color.Pink, Color.AliceBlue, Color.Yellow, Color.Magenta}.GetEnumeratorX
      4. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
      5. Me.BackgroundImage = _Images.YieldCyclic
      6. Me.Controls.OfType(Of Control).ForEach(Sub(ctl) ctl.BackColor = _Colors.YieldCyclic)
      7. End Sub
      8. End Class
      Mehr brauche ich hier nicht, um auf Knopfdruck alle BackgroundColors zu wechseln, und ausserdem das Hintergrundbild (so Dia-Show-mäßig)


      PS: Mit einem Timer kombiniert ists auch lustig, damit kann man zB Laufschriften erzeugen oder sowas - gugge auch StepByStep
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()