Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子字符串超出范围_C#_String_Substring - Fatal编程技术网

C# 子字符串超出范围

C# 子字符串超出范围,c#,string,substring,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 = ""; in

我试图从字符串的最后一部分提取数字,我已经编写了一个函数来实现这一点,但是在索引超出范围时遇到了问题

这是绳子

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.3。我已经逐步完成了代码,字符串长度是99,但是当我的startPos变为64,endPos变为98时,它实际上在这个范围内。

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

结果如下:

Substringint的第二个参数int不是结束位置,而是要返回的子字符串的长度

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

解决此问题的另一种方法是使用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;
    }
}

Substring获取一个开始索引和一个长度,64+98>99您尝试获取descOid=的开始索引,但它不是字符串的一部分。还是我瞎了?
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;
    }
}