Member 14514516 Ответов: 1

Argumentoutofrangeexception: индекс был вне диапазона. Должно быть неотрицательным и меньше размера коллекции


I'm using mvc core And I ran into a problem

here is my code



public async Task<IActionResult> Index(string filter, int page = 1, string sortExpression = "product")
    {
        List<String> arr = new List<string>();
        var qry = _context.Model.Where(op => op.Type == "Laptops").AsQueryable();
        int i = 0;
        if (!string.IsNullOrWhiteSpace(filter))
        {
            string[] parts = filter.Split(',');
            foreach (var item in parts)
            {
                arr.Add(item);
            }
            while (i<=arr.Count)
            {
                qry = qry.Where(op => op.product.Contains(arr[i]));
                i++;
            }
            var model = await PagingList.CreateAsync( qry
                           , 12, page, sortExpression, "product");
            model.RouteValue = new RouteValueDictionary {
                { "filter", filter}
            };
            return View("Index", model);
        }
        //var model = await PagingList.CreateAsync(
        //               qry, 12, page, sortExpression, "product");
        //model.RouteValue = new RouteValueDictionary {
        //    { "filter", filter}
        //};
        return View();
    }
}


Что я уже пробовал:

An unhandled exception occurred while processing the request.
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRange_IndexException()

InvalidOperationException: An exception was thrown while attempting to evaluate a LINQ query parameter expression. To show additional information call EnableSensitiveDataLogging() when overriding DbContext.OnConfiguring.
Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.ParameterExtractingExpressionVisitor.Evaluate(Expression expression, out string parameterName)

1 Ответов

Рейтинг:
0

OriginalGriff

Наверное, все дело в этом кусочке:

while (i<=arr.Count)
{
    qry = qry.Where(op => op.product.Contains(arr[i]));
    i++;
}
С i начинается с нуля, и вы позволяете ему равняться числу элементов в arr, вы получите ошибку на последней итерации в качестве элемента arr[arr.Count] не существует.


Member 14514516

что же делать?

Greg Utas

в то время как (i < arr.Рассчитывать)

Или переключитесь на C/C++, который не навязывает границы массива! /Сарк

Member 14514516

спасибо но все та же проблема

OriginalGriff

Тогда у вас есть это больше, чем один раз в вашем коде - начните искать!
Используйте отладчик, и он покажет вам строку, которая вызывает исключение - затем вы можете посмотреть, какой индекс используется и почему.

OriginalGriff

Трудно поверить, что люди, которые на самом деле могут писать код, не могут решить эту проблему для себя, не так ли? :вздыхать:

Member 14514516

Я уже использовал отладчик, и все в порядке, и число достигает номера массива, и все же есть проблема!

Dave Kreskowiak

Что вы подразумеваете под "числом, достигающим числа массива"?

Массив в .NET основан на 0, поэтому если у вас есть массив из 10 значений (Count=10), они будут иметь значения индекса от 0 до 9. Там нет индекса 10.

OriginalGriff

Покажите нам строку, на которой это происходит - отладчик покажет вам это; фактическое значение индекса, для которого это не удалось - отладчик покажет вам это также; и количество элементов в индексируемой коллекции - отладчик покажет вам это также!

Member 14514516

Вот
https://imgur.com/a/P2CBhXn
https://imgur.com/a/76AKdTL

Member 14514516

Во всяком случае, если попробовать (I<2)

все та же проблема

ZurdoDev

Дело в том, что только вы можете это исправить. Мы не можем запустить ваш код, поэтому вам нужно его отладить. Это очень легко сделать.