Обработка C # 2.0 Функция подстроки для динамических записей, чтобы избежать ошибки «Индекс и длина должны ссылаться на местоположение в строке». - PullRequest
1 голос
/ 28 декабря 2011

У меня был код ниже в VbScript для проверки действующего элемента навигации.

'==============================================
' 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 символов имели символ ".", Затем это действительный заголовок, в противном случае он недействителен.

Пожалуйста, предложите, какие могут быть наилучшие решения для вышеуказанной проблемы.1022 * Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Причина, по которой он работает в VB, заключается в том, что функция Left в VBScript прощает: если строка короче указанной вами длины, она просто молча выбирает доступную длину. В C # функция подстроки не прощает.

Чтобы решить вашу проблему, все, что вам нужно сделать, это заменить всю вашу функцию следующим:

if( title == null )
    return false;
int i = title.IndexOf( ". " );
return i >= 0 && i < 5;
1 голос
/ 28 декабря 2011

вы можете использовать метод 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
}
0 голосов
/ 28 декабря 2011

Хммм, одно решение просто щелкнуло у меня в голове. Пожалуйста, предложите, если оно лучше.

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));, и теперь он работает нормально.

Пожалуйста, предложите !!

...