0

环境:C#,VS2012,SharePoint 2010的间歇性“超出范围”的字符串比较例外

我使用一个控制台应用程序与SharePoint网站的接口,我试图做一个对简单的字符串比较警报标题的集合...但在调试时,我得到一个“超出范围”异常有时上的特定字符串。以下是代码片段:

// 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 - 测试结果:我一直在电池测试应用程序,而我仍然无法找到它工作时之间的一致性/,可以在阵列中使用2项炸弹,我发现了一些可能对一些线索原因。如果我将数组增加到3个项目,它将一直失败。当第一个或第二个字符串比较为真并且该项目被删除时,问题出现了,因为foreach循环在该点不会退出,它将继续测试剩余的字符串与现在不存在的警报,从而引发异常。 如果仅在数组中有两个项目发生这种情况,则在第一个项目触发删除后测试第二个项目并不总是会引发异常。有一半时间它会将已删除的警报“测试”,好像它仍在那里并继续执行主循环。

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

最终编辑:问题得到了充分的回答,突破部分仍未得到解答,但最终与情况无关。

+2

如何oAlertCollection得到它的数量? oAlertCollection.Count可以是0吗? – 2013-03-04 22:27:28

+0

想一想'oAlertCollection'为空时'i'的值。 (只需使用LINQ和'foreach(var alert:oAlertCollection.Reverse())'。另外,我会放弃匈牙利语,这对局部变量来说是毫无意义的。) – millimoose 2013-03-04 22:27:35

+0

是的,这很奇怪。你能捕捉到异常,看看'我'是否在'0..oAlertCollection.Count-1'范围内?你是否偶然删除'oAlertcollection'中的东西? – 2013-03-04 22:29:01

回答

2

正如吉姆·米歇尔指出以下只能如果你恰好在循环中删除从oAlertCollection元素


我要去无路可退,并假设你oAlertCollection有时可以容纳发生0元素,这就是为什么你的代码崩溃在这条线

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

,那么你会试图访问位置-1,抛出一个异常outofrange阵列中

你可以通过检查oAlertCollection.Count的价值循环这样

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

这样才可以避免这一点,如果它实际上是保持为0元您避免错误,因为它不会进入循环

+1

这只有在他从循环中某处的'oAlertCollection'中移除项目时才会发生。我怀疑这是原因。 – 2013-03-04 22:38:09

+0

你是对的,让我想想编辑它的方法 – 2013-03-04 22:40:17

+0

感谢您的建议,我会给它一个以防万一。但是,抛出异常时,'i'总是包含正值。 – thanby 2013-03-05 13:40:57