我编写了一个程序,用于比较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中。
为什么会这样?
答案 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
来电的第二个参数中。