Индекс ошибки был вне диапазона. Должен быть неотрицательным и меньше размера коллекции - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь заполнить свои объекты 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;

Ответы [ 3 ]

2 голосов
/ 07 апреля 2019

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

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);
}
1 голос
/ 07 апреля 2019

Ну, конечно, bdto длина меньше, чем transactionlist длина.

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

0 голосов
/ 17 июля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...