如何让IndexOf()方法返回正确的值?

时间:2013-04-25 13:06:27

标签: c# asp.net .net

我一直在使用googlemaps,我现在正在寻找格式坐标。

我按以下格式获取坐标:

地址(坐标)缩放级别。

我使用indexof方法得到“(”+1的开头,这样我得到坐标的第一个数字,并将这个值存储在我称之为“start”的变量中。

然后我做同样的事情,但这次我得到索引“)”-2来获取最后一个坐标的最后一个数字并将这个值存储在我称之为“结束”的变量中。

我收到以下错误: “索引和长度必须引用string.Parameter name中的位置:length”

我得到以下字符串作为一个参数:

"Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5"

根据我的计算,我应该在start变量中获得值36,在结束变量中获得值65

但由于某种原因,我在开始时得到41,在结束时得到71。

为什么?

public string RemoveParantheses(string coord)
        {
            int start = coord.IndexOf("(")+1;
            int end = coord.IndexOf(")")-2;

            string formated = coord.Substring(start,end);
            return formated;
        }

然后我尝试硬编码正确的值

string Test = cord.Substring(36,65);

然后我收到以下错误:

startindex不能大于字符串的长度。参数名称startindex

我理解这两个错误意味着什么但在这种情况下它们是不正确的,因为我不会超出字符串长度值。

谢谢!

6 个答案:

答案 0 :(得分:8)

Substring的第二个参数是长度(MSDN source)。由于您传递65第二个参数,因此您的来电正在尝试获取36101 (36+65)之间的字符。您的字符串中没有101个字符,因此会引发错误。要获取(字符之间的数据,请使用:

public string RemoveParantheses(string coord)
{
    int start = coord.IndexOf("(")+1;
    int end = coord.IndexOf(")")-2;

    string formated = coord.Substring(start, end - start);
    return formated;
}

编辑:它仅使用坐标的原因是因为总字符串的长度较短,并且由于坐标从第一个位置开始,因此结束坐标是最后一个位置。例如......

//using "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5"
int start = coord.IndexOf("(") + 1;  // 36
int end = coord.IndexOf(")")-2;      // 65
coord.Substring(start, end);         //looks at characters 35 through 101

//using (61.9593214318303,14.0585965625)5
int start = coord.IndexOf("(") + 1;  // 1
int end = coord.IndexOf(")")-2;      // 30
coord.Substring(start, end);         //looks at characters 1 through 31

第二个实例有效,因为31实际上存在于您的字符串中。将地址添加到字符串的开头后,您的代码将不再有效。

答案 1 :(得分:2)

Substring()的重载需要两个参数,即起始索引和长度。你提供了第二个值作为)出现的索引,当你真的要获得你想要修剪的字符串的长度时,在这种情况下你可以减去)的索引。 (的索引。例如: -

string foo = "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5";
int start = foo.IndexOf("(") + 1;
int end = foo.IndexOf(")");
Console.Write(foo.Substring(start, end - start));
Console.Read();

或者,您可以使用正则表达式解析字符串,例如: -

Match r = Regex.Match(foo, @"\(([^)]*)\)");
Console.Write(r.Groups[1].Value);

哪个可能比前一个例子好一点

答案 2 :(得分:2)

提取字符串的一部分对正则表达式很有用:

var match = Regex.Match(locationString, @"\((?<lat>[\d\.]+),(?<long>[\d\.]+)\)");

string latitude = match.Groups["lat"].Value;
string longitude = match.Groups["long"].Value;

答案 3 :(得分:1)

你可能忘了计算换行符和其他空格,\ r \ n换行符是2个“不可见”字符。另一个错误是你在(开始,结束)或(开始,结束 - 开始)

时调用子串(开始,结束)

答案 4 :(得分:1)

string input = 
  "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5";

var groups = Regex.Match(input, 
                         @"\(([\d\.]+),([\d\.]+)\)(\d{1,2})").Groups;
var lat = groups[1].Value;
var lon = groups[2].Value;
var zoom = groups[3].Value;

答案 5 :(得分:1)

  

根据我的计算,我应该在start变量中获得值36,在结束变量中获得值65

然后你的计算错了。在上面的字符串中,我也看到(和LinqPad确认)开放式票据位于第42位,而关闭票据位于第73位。

使用Substring时出现的错误是因为Substring的参数是起始位置而长度,而不是结尾位置,所以你应该使用:

string formated = coord.Substring(start,(end-start+1));