2011-12-28 60 views
1

我在VbScript中有下面的代码来检查有效的导航条目。处理C#2.0动态条目的子字符串函数以避免错误“索引和长度必须引用字符串中的位置”。

'============================================== 
' Function to test if a given item title is valid navigation item or not 
' Checks for '. ' in the first 5 characters of the title 
'============================================== 
Function CheckValidTitle(ByVal Title) 
    If Len(Title)=0 Then 
     CheckValidTitle=False 
     Exit Function 
    End if 
    If InStr(Left(Title, 6), ". ")>0 Then 
     CheckValidTitle=True 
    Else 
     CheckValidTitle=False 
    End if 
End Function 

如进一步,我在C#2.0写相同功能的逻辑,以下是代码:

public static bool CheckValidTitle(string title) 
{ 
    bool retvalue; 
    if (title.Length == 0) 
    { 
     retvalue = false; 
     return retvalue; 
    } 
    string partTitle = title.Substring(0, 5); 

    if (partTitle.Contains(". ")) 
    { 
     retvalue = true; 
    } 
    else 
    { 
     retvalue = false; 
    } 
    return retvalue; 
} 

现在,如果标题是一个长名称然后上述C#功能工作正常,例如,如果

title = "FAQ Popup New"; //然后正常工作,因为它是具有长在它超过5个字符,但如果

title = "ASPX"; //它未能作为字符小于5并给出错误“索引和长度必须引用字符串中的位置”。

根据要求,标题名称将是动态的,并且可以是任何字符数。我很惊讶它如何在VBScript中正常工作,因为写入的逻辑是相同的。

我想要经常检查前5个字符是否有“。”,那么它是有效的标题,否则它是无效的。

请建议什么可以是以上问题的最佳解决方案。

谢谢。

回答

2

为什么它在VB的原因是因为在VBScript中Left功能原谅:如果字符串比指定的长度短,它只是默默地选择可用的长度。在C#中,子字符串函数不能原谅。

解决你的问题,你需要做的就是用下面的替换整个函数:

if(title == null) 
    return false; 
int i = title.IndexOf(". "); 
return i >= 0 && i < 5; 
+0

内我们是否需要检查!string.IsNullOrEmpty(title)也是? – 2011-12-28 09:30:35

+0

如果标题可能为空,那么是的,你应该。但是你的代码没有检查null,所以我决定不检查。 '空'的情况已经在我的代码中通过i> = 0的检查来处理。 – 2011-12-28 09:32:20

+0

是的,可能会出现标题可能为空的情况,所以我们需要在retvalue = i <5 &&中加上这个! string.IsNullOrEmpty(标题);返回retvalue;请建议! – 2011-12-28 09:34:33

0

嗯,一个解决方案只是在我的脑海中点击,请建议是否最好。

public static bool CheckValidTitle(string title) 
{ 
    bool retvalue; 
    if (title.Length == 0) 
    { 
     retvalue = false; 
     return retvalue; 
    } 
    string partTitle = title.Substring(0,Math.Min(title.Length,5)); 

    if (partTitle.Contains(". ")) 
    { 
     retvalue = true; 
    } 
    else 
    { 
     retvalue = false; 
    } 
    return retvalue; 
} 

我改变string partTitle = title.Substring(0, 5);string partTitle = title.Substring(0,Math.Min(title.Length,5));,现在是工作的罚款。

请建议!!

+0

是的,这是可行的。但看到我的答案更容易一些。 – 2011-12-28 09:11:49

+0

这是更复杂,然后它需要。你不需要接收子字符串,你只需要知道是否有一个“。”。在前5个字符中,所以IndexOf方法是最好使用的。 – wdavo 2011-12-28 09:12:44

1

您可以使用indexOf方法

if (title.Contains(".") && title.IndexOf(".") < 5) 
{ 
    //there is a . in the first 5 characters 
} 

为了安全起见你应该检查该字符串不是空

if (!string.IsNullOrWhiteSpace(title) && title.Contains(".") && title.IndexOf(".") < 5) 
{ 
    //the string is not null or empty and there is a . in the first 5 characters 
} 
+1

这是不正确的;如果在标题中找不到*,* IndexOf将返回-1,*小于5,所以会出现误报。 – 2011-12-28 09:26:10

+0

我的错误。添加一个title.Contains以确保该值存在于标题 – wdavo 2011-12-28 09:35:01

相关问题