2013-10-24 70 views
2

我不斷收到一個索引超出範圍例外。不能是非負數,並且小於集合的大小。指數超出範圍。必須是非負的錯誤

問題是我檢查toRemove的人數比受訪者低。那麼這個錯誤是怎麼發生的?如果5個在respondentstoRemove只有3,那麼這個錯誤是怎麼發生的?

var respondents = RespondentRepository.GetRespondents(UserSession, fieldsToInclude); 

// iterate through the respondents. If search query not like results throw the result away. 
List<int> toRemove = new List<int>(); 
for (int i = 0; i < respondents.Count; i++) 
{ 
    if (!respondents[i].EmailAddresses.Any()) 
     toRemove.Add(i); 
    else 
    { 
     bool checkSingleEmail = false; 
     bool checkAllEmails = false; 
     for (int j = 0; j < respondents[i].EmailAddresses.Count; j++) 
     { 
      checkSingleEmail = respondents[i].EmailAddresses[j].Address.ToString().Contains(query); 

      if (checkSingleEmail == true) 
       checkAllEmails = true; 

      if (respondents[i].EmailAddresses.Count == 1 && j == 0 && checkAllEmails == false) 
       toRemove.Add(i); 
      else if (checkAllEmails == false && j+1 == respondents[i].EmailAddresses.Count) 
       toRemove.Add(i); 
     } 
    } 
} 

foreach (var respRemove in toRemove) 
{ 
    respondents.RemoveAt(respRemove); 
} 

回答

6

如果你想使用索引工作,你可以寫這樣說:

foreach (var respRemove in toRemove.OrderByDesc(r => r).ToList()) 
{ 
    respondents.RemoveAt(respRemove); 
} 
4

發生異常是因爲您從列表中刪除項目,然後假定其他項目仍處於同一索引處。嘗試保持對該項目的引用,而不是:

var respondents = RespondentRepository.GetRespondents(UserSession, fieldsToInclude); 

       // iterate through the respondents. If search query not like results throw the result away. 
       List<Respondent> toRemove = new List<Respondent>(); 
       for (int i = 0; i < respondents.Count; i++) 
       { 
        if (!respondents[i].EmailAddresses.Any()) 
         toRemove.Add(respondents[i]); 
        else 
        { 
         bool checkSingleEmail = false; 
         bool checkAllEmails = false; 
         for (int j = 0; j < respondents[i].EmailAddresses.Count; j++) 
         { 
          checkSingleEmail = respondents[i].EmailAddresses[j].Address.ToString().Contains(query); 

          if (checkSingleEmail == true) 
           checkAllEmails = true; 

          if (respondents[i].EmailAddresses.Count == 1 && j == 0 && checkAllEmails == false) 
           toRemove.Add(respondents[i]); 
          else if (checkAllEmails == false && j+1 == respondents[i].EmailAddresses.Count) 
           toRemove.Add(respondents[i]); 
         } 
        } 
       } 

       foreach (var respRemove in toRemove) 
       { 
        respondents.Remove(respRemove); 
       } 

例如,最後一項可能在索引4開始。但是,如果刪除索引3,則它現在位於索引3,索引4不存在。

+0

+1 oskar,你說的跟我自己差不多:) –

+0

當我嘗試使用上面的respRemove foreach時,我收到repondents.Remove(respRemove)的錯誤。最好的重載方法匹配有一些無效的參數。 – allencoded

+0

@allencoded那麼受訪者的類型是什麼? –

2

你需要改變:

respondents.RemoveAt(respRemove); 

respondents.Remove(respRemove); 

這是由於RemoveAt()被綁定到索引,並且該項目已被刪除,該命令將變爲無效。

2

在刪除之前顛倒toRemove的順序。然後在每次移除後保留其餘項目的索引。

toRemove.Reverse(); 

foreach (int respRemove in toRemove) 
{ 
    respondents.RemoveAt(respRemove); 
} 

另外要注意,如果是被添加我不止一次:

for (int j = 0; j < respondents[i].EmailAddresses.Count; j++) 
    { 
     ... 
      toRemove.Add(i); 

不要讓我被添加到文檔,刪除不止一次。

+0

例如,受訪者中的索引4(如果有5個項目)將不存在,即使您在索引0處首先刪除 –

+0

這就是爲什麼您刪除4,然後是0. –

+0

真實,愚蠢的我...... –

相關問題