Възникна необработено изключение от тип „System.ArgumentOutOfRangeException“ в mscorlib.dll

В следния код получих следната грешка.

Възникна необработено изключение от тип „System.ArgumentOutOfRangeException“ в mscorlib.dll

Допълнителна информация: Индексът беше извън диапазона. Трябва да е неотрицателен и по-малък от размера на колекцията.

Ето кода:

public ProcessInformation GetMaxRunTimeForApplicationsBetween(DateTime StartingTime, DateTime EndingTime)
    {

        //Filter Based on Timer
        List<ProcessInformation> filterList = new List<ProcessInformation>();

        foreach (HarvestApp.ProcessInformation item in this.ProcessList)
        {
            if (item.started_at.CompareTo(StartingTime) >= 0 && item.ended_at.CompareTo(EndingTime) <= 0)
            {
                filterList.Add(item);
            }
        }

        //Count Max Occurrence of Application
        List<int> countApplicationList = new List<int>();
        List<string> applicationNameList = new List<string>();
        

        foreach (HarvestApp.ProcessInformation item in filterList)
        {
            if (applicationNameList.Contains(item.name))
            {
                countApplicationList[applicationNameList.IndexOf(item.name)]++;
            }
            else
            {
                applicationNameList.Add(item.name);
                countApplicationList.Add(1);
                
            }
        }


        //if (countApplicationList.Count == 0)
        //{
        //    throw new InvalidOperationException("Empty list");
        //}


        int max = int.MinValue;
        foreach (int item in countApplicationList)
        {
            if (item > max)
            {
                max = item;
            }
         
        }
        
            //Return corresponding ProcessInformation Class of applicationNameList
            return filterList[filterList.FindIndex(delegate
                (ProcessInformation proc)
                {
                    return proc.name.Equals(applicationNameList[countApplicationList.IndexOf(max)], StringComparison.Ordinal);
                })];

       


    }

person user2413158    schedule 10.06.2013    source източник
comment
Отгатване на C# от името на изключението и стила на кода, но ако не, моля, маркирайте отново с етикет на подходящ език.   -  person Damien_The_Unbeliever    schedule 10.06.2013
comment
Това изключение може да възникне на няколко места в този код. На коя линия се проваля? Ти знаеш толкова много.   -  person Mike Perrenoud    schedule 10.06.2013
comment
възниква изключение при оператор за връщане.   -  person user2413158    schedule 10.06.2013
comment
Какво ще кажете за stacktrace?   -  person Andre    schedule 10.06.2013


Отговори (2)


Мисля, че редът за грешка е тук:

return filterList[filterList.FindIndex(delegate(ProcessInformation proc)
    {
        return proc.name.Equals(applicationNameList[countApplicationList.IndexOf(max)], StringComparison.Ordinal);
    })];

Тъй като List<T>.FindIndex може да върне -1, когато не можете да намерите индекс.

Вместо това трябва да тествате дали индексът е по-малък от 0, което показва, че има грешка, преди да го използвате:

int result = filterList.FindIndex(delegate(ProcessInformation proc)
        {
            return proc.name.Equals(applicationNameList[countApplicationList.IndexOf(max)], StringComparison.Ordinal);
        });

if(result < 0) throw new Exception("Cant't Find ProcessInformation"); 
return  filterList[result];
person 윤진수    schedule 10.06.2013
comment
да Грешка в извлечението за връщане. - person user2413158; 10.06.2013

Ето го проблема:

if (applicationNameList.Contains(item.name))
{
       **countApplicationList[applicationNameList.IndexOf(item.name)]++;**
}

Трябва да е така

if (applicationNameList.Contains(item.name) && countApplicationList.Count > applicationNameList.IndexOf(item.name))
    {
       countApplicationList[applicationNameList.IndexOf(item.name)]++;
    }
person Venu Vedula    schedule 10.06.2013
comment
Опитах това. Но все пак ми дава същото изключение. Показва проблем в оператора за връщане. - person user2413158; 10.06.2013