2

I keep getting an index out of range exception. Must not be non-negative and less than the size of the collection.

Problem is when I check toRemove the count is lower than than respondents. So how is this error occurring? If 5 are in respondents and toRemove is only 3 then how is this error occurring?

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);
}
4

4 に答える 4

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 は存在しません。

于 2013-10-24T13:47:30.427 に答える