2011-06-02 90 views
1

我正在写一个字符串替换函数来取代实际图像位置的微笑,但代码会因为所有嵌套的ifs而变得非常大和凌乱,但我不能想到更有效的方法编写代码。代码浓缩/效率

Public Function exchangeSmilies(ByVal postString As String) As String 
    Dim ChangedString = postString 
    ChangedString.ToLower() 
    If ChangedString.Contains(":)") Then 
     ChangedString = ChangedString.Replace(":)", GetSmilieMapPath("smile.gif")) 
     If ChangedString.Contains(":p") Then 
      ChangedString = ChangedString.Replace(":p", GetSmilieMapPath("toungue.gif")) 
      If ChangedString.Contains(";)") Then 
       ChangedString = ChangedString.Replace(";)", GetSmilieMapPath("wink.gif")) 
       If ChangedString.Contains("<3") Then 
        ChangedString = ChangedString.Replace("<3", GetSmilieMapPath("heart.gif")) 
       End If 
      End If 
     End If 
    End If 
    Return ChangedString 
End Function 

Public Function GetSmilieMapPath(ByVal SmilieImage As String) As String 
    GetSmilieMapPath = "<img src=" & Chr(34) & "../Images/Smilies/" & SmilieImage & Chr(34) & ">" 
    Return GetSmilieMapPath 
End Function 
+1

你的代码写的没有按”不要做你想做的事。如果一个字符串包含'<3'而不是':',你的代码将不会做任何替换。首先取消所有这些嵌套。然后,如果它仍然看起来很混乱,请尝试其他答案建议的字典方法。 – 2011-06-02 14:25:01

+0

在调用String.Replace之前,您不需要执行String.Contains。 – 2011-06-02 14:29:45

+0

+1,我也需要类似的解决方案 – user774411 2011-06-02 20:43:13

回答

4

使用字典来代替。

创建像在类级别以下的字典:

Dim dictionary As New Dictionary(Of String, String) 
dictionary.Add(":)", GetSmiliePath("smile.gif")) 
dictionary.Add(":p", GetSmiliePath("tongue.gif")) 
... 

在exchangeSmilies功能,可以遍历该字典更换任何事件:

... 
For Each pair In dictionary 
    If ChangedString.Contains(pair.Key) Then 
     ChangedString = ChangedString.Replace(pair.Key, pair.Value) 
    End If 
Next 
Return ChangedString 
+1

String.Contains可以省略 - 如果pair.Key不在那里,String.Replace将返回原始字符串。 – 2011-06-02 14:29:10

0

我还没有做很长一段时间的vb.net所以我不能给你确切的代码。但其基本思想是:制作一个包含符号键(“:)”)和文件名(“smile.gif”)值的地图。做一个静态成员变量。然后,只需遍历地图并执行if(字符串包含map.key),然后用f(map.value)替换字符串中的map.key。