#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>
, вы можете напрямую вернуть этот объект в метод.