Как мне написать Foreach, чтобы получить такой же результат, как мой запрос? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть такой код:

List<BankDepositHistoryDTO> BankDepositHistoryDTOs = new List<BankDepositHistoryDTO>();

for (int i = 0; i < query.Count; i++)
{
   BankDepositHistoryDTO b = new BankDepositHistoryDTO();

   b.AccountId = query[i].AccountId;
   b.Id = query[i].Id;
   b.Amount = query[i].Amount;
   b.AdditionalData = query[i].AdditionalData;
   b.ClientIp = query[i].ClientIp;
   b.Gateway = query[i].Gateway;
   b.PaymentRefNumber = query[i].PaymentRefNumber;
   b.ReturnUrl = query[i].ReturnUrl;
   b.State = query[i].State;
   b.Uuid = query[i].Uuid;


   BankDepositHistoryDTOs.Add(b);
}

Мне было интересно, смогу ли я получить его с циклом foreach.Это возможно?

Ответы [ 3 ]

4 голосов
/ 10 апреля 2019

Вы можете использовать проекцию с Linq Select, это может быть немного более кратким

var dtos = query.Select(x => new BankDepositHistoryDTO()
                             {
                                AccountId = x.AccountId,
                                Id = x.Id,
                                Amount = x.Amount,
                                AdditionalData = x.AdditionalData,
                                ClientIp = x.ClientIp,
                                Gateway = x.Gateway,
                                PaymentRefNumber = x.PaymentRefNumber,
                                ReturnUrl = x.ReturnUrl,
                                State = x.State,
                                Uuid = x.Uuid
                             }).ToList();

или

List<BankDepositHistoryDTO> BankDepositHistoryDTOs = new List<BankDepositHistoryDTO>();

foreach(var item in query)
{
   BankDepositHistoryDTO b = new BankDepositHistoryDTO();

   b.AccountId = item.AccountId;
   b.Id = item.Id;
   b.Amount = item.Amount;
   b.AdditionalData = item.AdditionalData;
   b.ClientIp = item.ClientIp;
   b.Gateway = item.Gateway;
   b.PaymentRefNumber = item.PaymentRefNumber;
   b.ReturnUrl = item.ReturnUrl;
   b.State = item.State;
   b.Uuid = item.Uuid;

   BankDepositHistoryDTOs.Add(b);
}
0 голосов
/ 10 апреля 2019

Я бы предложил цикл вместо использования foreach или linq из-за производительности. Цикл For всегда будет быстрее всех.

0 голосов
/ 10 апреля 2019

Вы можете использовать foreach как

        List<item> query = new List<item>();
        List<itemDto> test = new List<itemDto>();

        // either use this or the next method where mapping is done seperately
        query.ForEach(q => test.Add(new itemDto {id= q.id, type= q.type }));

        // Where the convert method is your conversion code
        // you can use a automapper/reflection to make it more generic
        query.ForEach(q => test.Add(Convert(q)));

Мои структуры для полноты

    public class item
    {
        public string id { get; set; }
        public string type { get; set; }
    }

    public class itemDto
    {
        public string id { get; set; }
        public string type { get; set; }
    }

    public itemDto Convert(item source)
    {
        itemDto target = new itemDto();
        target.id = source.id;
        target.type = source.type;
        return target;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...