环境: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如何工作的解释。即使它被删除后,它可能会暂时保留在内存中的警报吗?这是我看到它的唯一方法,每次测试删除的警报时都不会抛出异常。
最终编辑:这些问题得到了很好的回答,突破部分仍未得到答复,但最终与情况无关。
答案 0 :(得分:2)
正如Jim Mischel所指出的那样,只有当您在循环中删除oAlertCollection
中的元素时才会发生以下情况
我要走出困境并假设您的oAlertCollection
有时可以容纳0个元素,这就是您的代码在此行崩溃的原因
if (oAlertCollection[i].Title.Contains(sTitle))
然后,您将尝试访问引发outofrange异常的数组中的位置-1
您可以通过在循环之前检查oAlertCollection.Count
的值来避免这种情况
if(oAlertCollection.Count() > 0)
{
//for loop
}
这样,如果它实际上包含0个元素,则可以避免错误,因为它不会进入循环