19-12-17, 11:24 AM
(آخر تعديل لهذه المشاركة : 19-12-17, 11:26 AM {2} بواسطة silverlight.)
الهدف من استخدام IEnumerable(Of String) مع الكلاس هو أن نجعل الكلاس يدعم جملة For Each
أيضا الهدف هنا هو اخفاء الروتين IncrementString
عموما شكل الكلاس يجب أن يكون بالشكل التالي أنا فقط قمت بإعادة ضياغة الكود قليلا
يجب ملاحظة أن الكلاس الأصلي مكتوب بطريقة تجبرك علي استخدام length محدد
الكود التالي يوضح كيقية استخدام الكلاس
أيضا الهدف هنا هو اخفاء الروتين IncrementString
عموما شكل الكلاس يجب أن يكون بالشكل التالي أنا فقط قمت بإعادة ضياغة الكود قليلا
يجب ملاحظة أن الكلاس الأصلي مكتوب بطريقة تجبرك علي استخدام length محدد
PHP كود :
Imports System.Text
Public Class WordGenerator
Implements IEnumerable(Of String)
Private _length As Integer
Private _alphabets As List(Of Char)
Private _isValid As Integer
Public Sub New(chars As String)
Me.New(chars, CInt(chars.Length / 2) - 1)
End Sub
Public Sub New(chars As String, length As Integer)
_isValid = If(Not String.IsNullOrEmpty(chars), 1, 0)
_alphabets = chars.Distinct().ToList()
_length = length
End Sub
Private Sub IncrementString(sb As StringBuilder, index As Integer, values As List(Of Char))
If sb(index) <> values.Last() Then
sb(index) = values(values.IndexOf(sb(index)) + 1)
Return
End If
IncrementString(sb, index - 1, values)
sb(index) = values.First()
End Sub
Private Iterator Function GetEnumeratorInternal() As IEnumerator(Of String)
Dim sb As StringBuilder = New StringBuilder(_length)
For i As Integer = 0 To _length - 1
sb.Append(_alphabets(0))
Next
While True
Yield sb.ToString()
IncrementString(sb, _length - 1, _alphabets)
If sb.ToString().Distinct().Count() = 1 AndAlso sb.ToString().Distinct().Single() = _alphabets.Last() Then
Yield sb.ToString()
Return
End If
End While
End Function
Public Function GetEnumerator() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
Return CType(GetEnumeratorInternal(), IEnumerator(Of String))
End Function
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return CType(GetEnumeratorInternal(), IEnumerator(Of String))
End Function
End Class
الكود التالي يوضح كيقية استخدام الكلاس
PHP كود :
Dim s As String = "visual basic"
Dim wg As WordGenerator = New WordGenerator(s)
For Each value As String In wg
' إظهار البيانات في ليست بوكس
ListBox1.Items.Add(value)
Next
Retired

