子串超出范围

时间:2015-06-05 12:36:54

标签: c# string substring

我正在尝试从字符串的最后一部分中提取数字,我已经编写了一个函数来执行此操作,但是我遇到了超出范围索引的问题。

这是字符串

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时,实际上在该范围内。

3 个答案:

答案 0 :(得分:4)

再次阅读文档,第二个值是长度,而不是索引。

找到了on MSDN

public string Substring(
    int startIndex,
    int length
)

答案 1 :(得分:4)

Substring(int, int)的第二个参数不是“结束位置”,而是要返回的子字符串的长度。

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

答案 2 :(得分: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;
    }
}