2015-06-05 2 views
0

Я пытаюсь извлечь номер из последней части строки, я написал функцию для этого, но у меня проблемы с индексом вне диапазона.Подстрока вне диапазона

Вот это строка

type="value" cat=".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.1" descCat=".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.3" 

и вот моя функция

private static string ExtractDescOID(string property) 
{ 
    string result = ""; 
    int startPos = property.LastIndexOf("descOid=\"") + "descOid=\"".Length; 
    int endPos = property.Length - 1; 
    if (endPos - startPos != 1) 
    { 
     //This now gets rid of the first . within the string. 
     startPos++; 
     result = property.Substring(startPos, endPos); 
    } 
    else 
    { 
     result = ""; 
    } 

    if (startPos == endPos) 
    { 
     Console.WriteLine("Something has gone wrong"); 
    } 

    return result; 
} 

Я хочу, чтобы иметь возможность получить 1.3.6.1.4.1.26928.1.1.1.2.1.2.1.3 эту часть строки. Я прошел через код, длина строки равна 99, но когда AND MY startPos становится 64, а endPos становится 98, который фактически находится в пределах диапазона.

+1

'подстрока()' принимает индекс начала и длину, и 64 + 98> 99 –

+0

Вы пытаетесь получить индекс стартового 'descOid =', но это не является частью вашей строки. Или я слепой? – BendEg

ответ

4

Второй аргумент Substring(int, int) не «конечное положение», но длина подстроки для возврата.

result = property.Substring(startPos, endPos - startPos); 
4

Прочтите документацию еще раз, второе значение - это длина, а не индекс.

Как найдено on MSDN:

public string Substring(
    int startIndex, 
    int length 
) 
1

Другой подход к этой проблеме может быть за счет использования string.Split() заботиться о разборе для вас. Единственная причина, почему я предлагаю это (кроме того, что мне нравится представлять дополнительные варианты того, что уже есть, плюс это выход от ленивого человека) заключается в том, что с точки зрения кода код проще ИМХО разлагаться и при разложении , легче понять другими.

Вот пример программы с некоторыми комментариями, чтобы проиллюстрировать мою точку (проверенный, кстати).

class Program 
{ 
    static void Main(string[] args) 
    { 
     var someAttributesFromAnXmlNodeIGuess = 
"type=\"value\" cat=\".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.1\" descCat=\".1.3.6.1.4.1.26928.1.1.1.2.1.2.1.3\""; 

     var descCat = GetMeTheAttrib(someAttributesFromAnXmlNodeIGuess, "descCat"); 

     Console.WriteLine(descCat); 
     Console.ReadLine(); 
    } 

    // making the slightly huge assumption that you may want to 
    // access other attribs in the string... 
    private static string GetMeTheAttrib(string attribLine, string attribName) 
    { 
     var parsedDictionary = ParseAttributes(attribLine); 

     if (parsedDictionary.ContainsKey(attribName)) 
     { 
      return parsedDictionary[attribName]; 
     } 

     return string.Empty; 
    } 

    // keeping the contracts simple - 
    // i could have used IDictionary, which might make sense 
    // if this code became LINQ'd one day 
    private static Dictionary<string, string> ParseAttributes(string attribLine) 
    { 
     var dictionaryToReturn = new Dictionary<string, string>(); 

     var listOfPairs = attribLine.Split(' '); // items look like type=value, etc 
     foreach (var pair in listOfPairs) 
     { 
      var attribList = pair.Split('='); 

      // we were expecting a type=value pattern... if this doesn't match then let's ignore it 
      if (attribList.Count() != 2) continue; 

      dictionaryToReturn.Add(attribList[0], attribList[1]); 
     } 

     return dictionaryToReturn; 
    } 
} 
Смежные вопросы