تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[مساعدة] تحويل من #C إلى Vb
#1
أرجو تحويل هذا الكلاس من السي شارب إلى فيجوال بيسك
PHP كود :
class WordGen IEnumerable<string>
{
 
   private int len;
 
   private List<charalphabet;
 
 
   public WordGen(string charsint length)
 
   {
 
       alphabet chars.Distinct().ToList();
 
       len length;
 
   }
 
 
   private void incString(StringBuilder sint index, List<charalphabet)
 
   {
 
       if (s[index] != alphabet.Last())
 
       {
 
           s[index] = alphabet[alphabet.IndexOf(s[index]) + 1];
 
           return;
 
       }
 
       incString(sindex 1alphabet);
 
       s[index] = alphabet.First();
 
   }
 
 
   public IEnumerator<stringGetEnumerator()
 
   {
 
       StringBuilder sb = new StringBuilder(len);
 
       for (int i 0leni++)
 
       {
 
           sb.Append(alphabet[0]);
 
       }
 
 
       while (true)
 
       {
 
           yield return sb.ToString();
 
           incString(sblen 1alphabet);
 
           if (sb.ToString().Distinct().Count() == && sb.ToString().Distinct().Single() == alphabet.Last())
 
           {
 
               yield return sb.ToString();
 
               yield break;
 
           }
 
 
       }
 
   }
 
 
   IEnumerator IEnumerable.GetEnumerator()
 
   {
 
       return GetEnumerator();
 
   }

الرد }}}
تم الشكر بواسطة:
#2
(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 StringByVal length As Integer)
 
       alphabet chars.Distinct().ToList()
 
       len length
    End Sub

    Private Sub incString
(ByVal s As StringBuilderByVal index As IntegerByVal alphabet As List(Of Char))
 
       If s(index) <> alphabet.Last() Then
            s
(index) = alphabet(alphabet.IndexOf(s(index)) + 1)
 
           Return
        End 
If

 
       incString(sindex 1alphabet)
 
       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(sblen 1alphabet)
 
           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
الرد }}}
تم الشكر بواسطة:
#3
IEnumerable هو Interface
جرب تضع Implements بدلا من Inherits
الرد }}}
تم الشكر بواسطة:
#4
الهدف من استخدام 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(charsCInt(chars.Length 2) - 1)
 
   End Sub

    Public Sub 
New(chars As Stringlength As Integer)
 
       _isValid = If(Not String.IsNullOrEmpty(chars), 10)
 
       _alphabets chars.Distinct().ToList()
 
       _length length
    End Sub

    Private Sub IncrementString
(sb As StringBuilderindex As Integervalues As List(Of Char))
 
       If sb(index) <> values.Last() Then
            sb
(index) = values(values.IndexOf(sb(index)) + 1)
 
           Return
        End 
If
 
       IncrementString(sbindex 1values)
 
       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
الرد }}}
تم الشكر بواسطة:
#5
الكود التالي عبارة عن كلاس يؤدي نفس الفكرة
الكلاس مكتوب بشكل يختلف قليلا عن الكلاس الخاص بك
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), 10)
 
   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 StringString) = Function(svalues(i).ToString values(i).ToString values(i).ToString s
                Dim indented 
As String String.Empty
 
               If TryIncrement(funcThen
                    indented 
+= func(values(values.Count i).ToString)
 
                   result.Add(indented)
 
               End If
 
               i += 1
            End 
While
 
       End If

 
       Return result
    End 
Function

 
   Private Function TryInCrement(ByRef source As Stringfunc As Func(Of StringString)) 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 StringString)) As Boolean
        Dim source 
As String Nothing
        Return TryInCrement
(sourcefunc)
 
   End Function

 
   Public Function GetEnumerator() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
        Return 
If(_validCType(Increment(), IEnumerable(Of String)).GetEnumerator, New List(Of String)().GetEnumerator)
 
   End Function

 
   Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
        Return 
If(_validCType(Increment(), IEnumerable(Of String)).GetEnumerator, New List(Of String)().GetEnumerator)
 
   End Function

End Class 

طريقة الاستخدام


PHP كود :
Public Class Form1
    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles 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
الرد }}}
تم الشكر بواسطة: أحمد إبراهيم سعد



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم