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