المشاركات : 27
المواضيع 7
الإنتساب : Sep 2017
السمعة :
2
الشكر: 5
تم شكره 3 مرات في 3 مشاركات
أرجو تحويل هذا الكلاس من السي شارب إلى فيجوال بيسك
PHP كود :
class WordGen : IEnumerable<string> { private int len; private List<char> alphabet; public WordGen(string chars, int length) { alphabet = chars.Distinct().ToList(); len = length; } private void incString(StringBuilder s, int index, List<char> alphabet) { if (s[index] != alphabet.Last()) { s[index] = alphabet[alphabet.IndexOf(s[index]) + 1]; return; } incString(s, index - 1, alphabet); s[index] = alphabet.First(); } public IEnumerator<string> GetEnumerator() { StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len; i++) { sb.Append(alphabet[0]); } while (true) { yield return sb.ToString(); incString(sb, len - 1, alphabet); if (sb.ToString().Distinct().Count() == 1 && sb.ToString().Distinct().Single() == alphabet.Last()) { yield return sb.ToString(); yield break; } } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
المشاركات : 27
المواضيع 7
الإنتساب : Sep 2017
السمعة :
2
الشكر: 5
تم شكره 3 مرات في 3 مشاركات
(18-12-17, 05:35 AM)khodor1985 كتب : PHP كود :
Class WordGen Inherits IEnumerable(Of String)
Private len As Integer
Private alphabet As List(Of Char)
Public Sub New(ByVal chars As String, ByVal length As Integer) alphabet = chars.Distinct().ToList() len = length End Sub
Private Sub incString(ByVal s As StringBuilder, ByVal index As Integer, ByVal alphabet As List(Of Char)) If s(index) <> alphabet.Last() Then s(index) = alphabet(alphabet.IndexOf(s(index)) + 1) Return End If
incString(s, index - 1, alphabet) s(index) = alphabet.First() End Sub
Public Iterator Function GetEnumerator() As IEnumerator(Of String) Dim sb As StringBuilder = New StringBuilder(len) For i As Integer = 0 To len - 1 sb.Append(alphabet(0)) Next
While True Yield sb.ToString() incString(sb, len - 1, alphabet) If sb.ToString().Distinct().Count() = 1 AndAlso sb.ToString().Distinct().Single() = alphabet.Last() Then Yield sb.ToString() Return End If End While End Function
Private Function GetEnumerator() As IEnumerator Return GetEnumerator() End Function End Class
عند كتابة هذا الكلاس يسطر بالأحمر تحت IEnumerable(Of String)
PHP كود :
Inherits IEnumerable(Of String)
وكذلك يسطر تحت الدالة GetEnumerator
المشاركات : 400
المواضيع 0
الإنتساب : Dec 2017
السمعة :
69
الشكر: 46
تم شكره 517 مرات في 325 مشاركات
IEnumerable هو Interface
جرب تضع Implements بدلا من Inherits
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
19-12-17, 11:24 AM
(آخر تعديل لهذه المشاركة : 19-12-17, 11:26 AM {2} بواسطة silverlight.)
الهدف من استخدام IEnumerable(Of String) مع الكلاس هو أن نجعل الكلاس يدعم جملة For Each
أيضا الهدف هنا هو اخفاء الروتين 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
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
الكود التالي عبارة عن كلاس يؤدي نفس الفكرة
الكلاس مكتوب بشكل يختلف قليلا عن الكلاس الخاص بك
PHP كود :
Public Class WordGenerator Implements IEnumerable(Of String)
Private _source As String Private _valid As Integer
Public Sub New(source As String) _source = source _valid = If(Not String.IsNullOrEmpty(source), 1, 0) End Sub
Private Function Increment() As List(Of String) Dim values As List(Of Char) = CType(Nothing, List(Of Char)) Dim result As List(Of String) = CType(Nothing, List(Of String)) If _valid Then values = _source.Distinct().ToList result = New List(Of String)() Dim i As Integer = 0 While i < values.Count Dim func As Func(Of String, String) = Function(s) values(i).ToString + values(i).ToString + values(i).ToString + s Dim indented As String = String.Empty If TryIncrement(func) Then indented += func(values(values.Count - 1 - i).ToString) result.Add(indented) End If i += 1 End While End If
Return result End Function
Private Function TryInCrement(ByRef source As String, func As Func(Of String, String)) As Boolean While func IsNot Nothing Dim src As String = source Dim dest As String = func(src) If src = dest Then Exit While End If If src <> dest Then Return True End If End While Return False End Function
Private Function TryIncrement(func As Func(Of String, String)) As Boolean Dim source As String = Nothing Return TryInCrement(source, func) End Function
Public Function GetEnumerator() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator Return If(_valid, CType(Increment(), IEnumerable(Of String)).GetEnumerator, New List(Of String)().GetEnumerator) End Function
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator Return If(_valid, CType(Increment(), IEnumerable(Of String)).GetEnumerator, New List(Of String)().GetEnumerator) End Function
End Class
طريقة الاستخدام
PHP كود :
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim s As String = "ABCDEF" Dim wg As WordGenerator = New WordGenerator(s) For Each value As String In wg ListBox1.Items.Add(value) Next End Sub End Class
Retired
|