比较两个很长的字符串,得到错误:'System.ArgumentOutOfRangeException'

时间:2014-09-18 21:32:04

标签: c#

我编写了一个程序,用于比较C#中的两个非常长的字符串(10 000 000)。

代码是这样的:

// sample strings for you:
string test1 = new string('A',100000000), test2 =new string('A',100000000);
int i = 0, interval = 100000, size = test1.Length;
if (test1.Length != test2.Length)
{
    return;
}
else
{
    while(i + interval < size){
    if (test1.Substring(i, i + interval) == test2.Substring(i, i + interval))
    {
          //TO DO          
    }
    else
    {
        Console.WriteLine(i);
    }

    i += interval;
}

然而,它出现了错误:类型&#39; System.ArgumentOutOfRangeException&#39;的未处理异常。当i = 5 400 000时,发生在mscorlib.dll中。

为什么会这样?

1 个答案:

答案 0 :(得分:4)

见这一行:

if (test1.Substring(i, i + interval) == test2.Substring(i, i + interval))

String.Substring的第二个参数是according to the docs

  

长度(System.Int32):子字符串中的字符数。

使用将其作为“要检索的最后一个索引”。根据这些相同的文档,如果出现ArgumentOutOfRangeException,则会抛出:{/ p>

startIndex plus length indicates a position not within this instance.
 -or-
startIndex or length is less than zero.

中途,你正在检索Substring(test1.length / 2, (test1.length / 2) + interval),一旦你到达字符串的一半,第一个条件为真,这符合你提到的一个超过一百万字符串的540万标记。


管理摘要:您不应将i添加到Substring来电的第二个参数中。