2016-08-16 7 views
1

В настоящее время я пытаюсь преобразовать функцию (для сравнения с String и проверить процент соответствия) с C# на VBA.Сравнение VBA String

C#:

public static double CompareStrings(string str1, string str2) 
    { 
     List<string> pairs1 = WordLetterPairs(str1.ToUpper()); 
     List<string> pairs2 = WordLetterPairs(str2.ToUpper()); 

     int intersection = 0; 
     int union = pairs1.Count + pairs2.Count; 

     for (int i = 0; i < pairs1.Count; i++) 
     { 
      for (int j = 0; j < pairs2.Count; j++) 
      { 
       if (pairs1[i] == pairs2[j]) 
       { 
        intersection++; 
        pairs2.RemoveAt(j);//Must remove the match to prevent "GGGG" from appearing to match "GG" with 100% success 

        break; 
       } 
      } 
     } 

     return (2.0 * intersection)/union; 
    } 

    private static List<string> WordLetterPairs(string str) 
    { 
     List<string> AllPairs = new List<string>(); 

     // Tokenize the string and put the tokens/words into an array 
     string[] Words = Regex.Split(str, @"\s"); 

     // For each word 
     for (int w = 0; w < Words.Length; w++) 
     { 
      if (!string.IsNullOrEmpty(Words[w])) 
      { 
       // Find the pairs of characters 
       String[] PairsInWord = LetterPairs(Words[w]); 

       for (int p = 0; p < PairsInWord.Length; p++) 
       { 
        AllPairs.Add(PairsInWord[p]); 
       } 
      } 
     } 

     return AllPairs; 
    } 

    private static string[] LetterPairs(string str) 
    { 
     int numPairs = str.Length - 1; 

     string[] pairs = new string[numPairs]; 

     for (int i = 0; i < numPairs; i++) 
     { 
      pairs[i] = str.Substring(i, 2); 
     } 

     return pairs; 
    } 

Моих V Конверсия:

Option Explicit 


Function CompareStrings(str1 As String, str2 As String) 
    Dim pairs1 As New Collection 
    Dim pairs2 As New Collection 
    pairs1 = WordLetterPairs(UCase(str1)) 
    pairs2 = WordLetterPairs(UCase(str2)) 
    Dim intersection, union, i, j As Integer 
    intersection = 0 
    union = pairs1.Count + pairs2.Count 

    For i = 0 To pairs1.Count 
     For j = 0 To pairs2.Count 
      If pairs1.Item(i) = pairs2.Item(i) Then 
       intersection = intersection + 1 
       pairs2.Remove (j) 
       Exit For 
      End If 

     Next j 
    Next i 
CompareStrings = ((2 * intersection)/union) 
End Function 

Function WordLetterPairs(str As String) 
    Dim AllPairs As New Collection 
    Dim words() As String 
    words = SplitRe(str, "\s", True) 
    Dim w As Integer 
    For w = 0 To UBound(words) 
    If Len(Trim(words(w))) = 0 Then 
     Dim PairsInWord() As String 
     PairsInWord = LetterPairs(words(w)) 
     For p = 0 To PairsInWord.Count 
      AllPairs.Add (PairsInWord(p)) 
     Next p 
    End If 
    Next w 
    WordLetterPairs = AllPairs 
End Function 
Public Function SplitRe(text As String, pattern As String, Optional ignorecase As Boolean) As String() 
    Static re As Object 
    If re Is Nothing Then 
    Set re = CreateObject("VBScript.RegExp") 
    re.Global = True 
    re.MultiLine = True 
    End If 
    re.ignorecase = ignorecase 
    re.pattern = pattern 
    SplitRe = Strings.Split(re.Replace(text, vbNullChar), vbNullChar) 
End Function 

Public Function LetterPairs(ByVal str As String) 
Dim numPairs, w As Integer 
numPairs = Len(str) - 1 
Dim pairs(numPairs) As String 
For w = 0 To numPairs 
pairs(w) = Mid(str, w, 2) 
Next w 
End Function 
Sub Schaltfläche1_Klicken() 
MsgBox (CompareStrings("LOL", "L")) 
End Sub 

Я получаю сообщение об ошибке в первой строке CompareStrings, "Параметр не является факультативным". Что я неправильно сделал?

+0

Какая линия это происходит – litelite

+0

pairs1 = WordLetterPairs (UCase (str1)) – Curunir

+0

попробуйте изменить pairs1 = WordLetterPairs (UCase (str1)) Настройка pairs1 = WordLetterPairs (UCase (str1)). Вы должны использовать ключевое слово Set при назначении переменных объекта. – Jeremy

ответ

0

Выполняет ли это по желанию? Желаете ли вы вернуть несовместимые матчи?

Function StringCompare(str1 As String, str2 As String) As Double 

Dim intLength As Integer 
Dim iLetter As Integer 

intLength = Len(str1) 

For i = 1 To intLength 
    If Mid(str1, i, 1) = Mid(str2, i, 1) Then 
     StringCompare = StringCompare + 1 
    End If 
Next 

StringCompare = StringCompare/intLength 

End Function 
+0

Вид правильного направления, но C# - битвыборщик – Curunir

 Смежные вопросы

  • Нет связанных вопросов^_^