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:
So, jetzt aber der lustige Code aussm Form, wo das alles in wahrhaft minimalistischer Form verbaut ist:
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
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
VB.NET-Quellcode
- Imports System.Runtime.CompilerServices
- Namespace System.Collections.Generic
- <HideModuleName()> _
- Public Module CollectionX
- ''' <summary>executes the action for each item</summary>
- <DebuggerStepThrough(), Extension()> _
- Public Sub ForEach(Of T)(ByVal itms As IEnumerable(Of T), ByVal Action As Action(Of T))
- For Each itm In itms : Action(itm) : Next
- End Sub
- ''' <summary>returns the **typisized** Enumerator of the array</summary>
- <Extension(), DebuggerStepThrough()> _
- Public Function GetEnumeratorX(Of T)(ByVal arr As T()) As IEnumerator(Of T)
- Return DirectCast(arr, IList(Of T)).GetEnumerator
- End Function
- ''' <summary>returns the next item. Exception on empty collection</summary>
- <DebuggerStepThrough(), Extension()> _
- Public Function YieldCyclic(Of T)(ByVal enrt As IEnumerator(Of T)) As T
- With enrt
- If .MoveNext Then Return .Current
- .Reset() : .MoveNext() : Return .Current
- End With
- End Function
- ''' <summary>returns the next item. Exception when collection exhaustet</summary>
- <DebuggerStepThrough(), Extension()> _
- Public Function Yield(Of T)(ByVal enrt As IEnumerator(Of T)) As T
- enrt.MoveNext()
- Return enrt.Current
- End Function
- End Module
- 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
- .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
- Public Class frmEnumeratorExtensions
- Private _Images As IEnumerator(Of Bitmap) = {My.Resources.Colors, My.Resources.BattleOfShanghaiBaby, My.Resources.du_bist_faul, My.Resources.nevermore}.GetEnumeratorX
- Private _Colors As IEnumerator(Of Color) = {Color.Red, Color.Pink, Color.AliceBlue, Color.Yellow, Color.Magenta}.GetEnumeratorX
- Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
- Me.BackgroundImage = _Images.YieldCyclic
- Me.Controls.OfType(Of Control).ForEach(Sub(ctl) ctl.BackColor = _Colors.YieldCyclic)
- End Sub
- End Class
PS: Mit einem Timer kombiniert ists auch lustig, damit kann man zB Laufschriften erzeugen oder sowas - gugge auch StepByStep
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()