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

#c# #arrays #indexoutofrangeexception

#c# #массивы #исключение indexoutofrangeexception

Вопрос:

Я пытаюсь заполнить свои объекты DTO с помощью for, но я получил эту ошибку:

 Index was out of range. Must be non-negative and less than the size of the collection
  

Вот мой код:

  public static List <BankDepositHistoryDTO> DtoTODomain()
        {
            MyketAdsEntities context = new MyketAdsEntities();
            List<BankDepositHistoryDTO> bdto = new List<BankDepositHistoryDTO>();


            //var transactionlist


            var transactionlist = GetListoftransactions.GetAccountingListoftransactions();
            for (int i = 0; i < transactionlist.Count; i  )
            {
                bdto[i].AccountId = transactionlist[i].AccountId;
                bdto[i].Id = transactionlist[i].Id;
                bdto[i].Amount = transactionlist[i].Amount;
                bdto[i].AdditionalData = transactionlist[i].AdditionalData;
                bdto[i].ClientIp = transactionlist[i].ClientIp;
                bdto[i].Gateway = transactionlist[i].Gateway;
                bdto[i].PaymentRefNumber = transactionlist[i].PaymentRefNumber;
                bdto[i].ReturnUrl = transactionlist[i].ReturnUrl;
                bdto[i].State = transactionlist[i].State;
                bdto[i].Uuid = transactionlist[i].Uuid;



            }
            return bdto;

        }
  

Я получил это сообщение здесь

 bdto[i].AccountId = transactionlist[i].AccountId;
  

Ответ №1:

Вы создали пустой список и не добавляете в него элементы. Вы должны сначала добавить элемент, а затем обновить его свойства:

 for (int i = 0; i < transactionlist.Count; i  )
{
    BankDepositHistoryDTO b = new BankDepositHistoryDTO();
    b.AccountId = transactionlist[i].AccountId;
    b.Id = transactionlist[i].Id;b
    b.Amount = transactionlist[i].Amount;
    b.AdditionalData = transactionlist[i].AdditionalData;
    b.ClientIp = transactionlist[i].ClientIp;
    b.Gateway = transactionlist[i].Gateway;
    b.PaymentRefNumber = transactionlist[i].PaymentRefNumber;
    b.ReturnUrl = transactionlist[i].ReturnUrl;
    b.State = transactionlist[i].State;
    b.Uuid = transactionlist[i].Uuid;
    bdto.Add(b);
}
  

Ответ №2:

Очевидно, что bdto длина меньше transactionlist длины.

перед циклом for вы можете изменить размер bdto в соответствии transactionlist

Ответ №3:

Я полностью согласен с ответом @Ashkan и @Mureinik, но просто для улучшения кода вы можете использовать AutoMapper. Это уменьшит цикл и итерацию для каждого элемента. Кажется, что все свойства между этими двумя объектами одинаковы.

 Mapper.CreateMap<Transaction,BankDepositHistoryDTO>(); 
BankDepositHistoryDTO obj = Mapper.Map<Transaction,BankDepositHistoryDTO>(TransactionObj);
  

Также, если GetListoftransactions.GetAccountingListoftransactions(); возвращает List<BankDepositHistoryDTO> , вы можете напрямую вернуть этот объект в метод.