字符串比较中间歇性的“超出范围”异常

时间:2013-03-04 22:24:27

标签: c# console-application string-comparison outofrangeexception

环境:C#,VS2012,SharePoint 2010

我正在使用控制台应用程序与SharePoint站点进行交互,我正在尝试对一组警报标题进行简单的字符串比较...但是在调试时我遇到了“超出范围”的异常< em>有时在特定的字符串上。这是代码片段:

// This is pointing to a txt file with two lines in it, "folder1" and "folder3"
string[] aTitleList = System.IO.File.ReadAllLines(@"c:\path\to\specific\file.txt");
// Now we iterate through all the alerts to compare titles against those two lines
for (int i = oAlertCollection.Count - 1; i > -1; i--)
{
    System.Guid guid = oAlertCollection[i].ID;
    foreach (string sTitle in aTitleList)
    {
        if (oAlertCollection[i].Title.Contains(sTitle))
        {
            // At this point it throws the exception on the sTitle string
            // But ONLY on "folder3" and ONLY about half of the time
            // If I change it to something other than "folder3" it works 100%
        }
    }
}

对其他人来说这看起来有点奇怪吗?我在这个应用程序中有很多其他方法做类似的比较并且没有问题,即使使用“folder3”字符串,只有当我使用这个特定的数组时才遇到麻烦。

编辑1 - 循环的深入解释:在这种情况下,循环是删除与给定字符串匹配的项目。设置循环的方式,它从最后一项开始并迭代直到达到0(这是因为SharePoint自动将集合中每个项目的ID向下移动以替换已删除的项目,因此没有间隙,这它也是获取Count方法的地方,查看集合中编号最高的ID)。澄清一下:Count方法返回警报总数,但实际警报ID从0开始,因此for循环会在使用i对其进行索引之前调整计数。如果Count方法返回0个元素,则for循环将其设置为-1并且不会触发。

编辑2 - 测试结果:我一直在对应用进行电池测试,虽然在使用阵列中的两个项目时仍然无法找到工作/炸弹之间的一致性,但我发现了一些可能揭示了原因。如果我将数组增加到3个项目,它将一直失败。当第一个或第二个字符串比较为真且项目被删除时出现问题,因为foreach循环在此时没有退出,它继续针对现在不存在的警报测试剩余的字符串,这会抛出例外。 当数组中只有两个项目发生这种情况时,在第一个项目触发删除后测试第二个项目并不总是抛出异常。有一半时间它“测试”已删除的警报,就好像它仍在那里并继续主循环。

作为参考,这是SPAlertCollection如何工作的解释。即使它被删除后,它可能会暂时保留在内存中的警报吗?这是我看到它的唯一方法,每次测试删除的警报时都不会抛出异常。

最终编辑:这些问题得到了很好的回答,突破部分仍未得到答复,但最终与情况无关。

1 个答案:

答案 0 :(得分:2)

正如Jim Mischel所指出的那样,只有当您在循环中删除oAlertCollection中的元素时才会发生以下情况


我要走出困境并假设您的oAlertCollection有时可以容纳0个元素,这就是您的代码在此行崩溃的原因

if (oAlertCollection[i].Title.Contains(sTitle))

然后,您将尝试访问引发outofrange异常的数组中的位置-1

您可以通过在循环之前检查oAlertCollection.Count的值来避免这种情况

if(oAlertCollection.Count() > 0)
{
    //for loop
}

这样,如果它实际上包含0个元素,则可以避免错误,因为它不会进入循环