Как преобразовать пару ключ-значение в список настраиваемых объектов

введите описание изображения здесь У меня есть keyValupair Hotel details ;:

// Отсюда данные: -

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
            dynamic hotels1 = (dynamic)json_serializer.DeserializeObject(jso);
var keyValuePairs = hotels1["hotels"];

var hotelList = keyValuePairs["hotels"];   // hotelList[0]  ={'key'='Code' ;value='123'} 
                                           //{'key'='Name' 
                                           // ;value='Sheraton'}  

как мне преобразовать это в список Hotel

List<Hotel> hotaals = new List<Hotel>();

где Hotel

public class Hotel
{
    public int code { get; set; }
    public string name { get; set; }
}

Я использую цикл for для сопоставления полей, но мой великий начальник говорит, что он неэффективен, и мне приходится использовать Linq.

Цикл, который я использую

    foreach (dynamic h in hotelList)
    {

        oneHotel = new Hotel();
        oneHotel.code = h["code"];
        oneHotel.name = h["name"];
  myHotels.Add(oneHotel);
 }

person Jayapen Jose    schedule 08.10.2019    source источник
comment
Покажи, как ты получаешь свой квп ...   -  person zaggler    schedule 09.10.2019
comment
Вы имеете в виду, что у вас есть Dictionary<string, string>, которое нужно преобразовать в List<class>, где члены класса не соответствуют KeyValuePair (s) вашего Словаря? О неэффективности цикла (...).   -  person Jimi    schedule 09.10.2019
comment
Цикл неэффективен для выполнения или скорости программирования? Если ваш великий начальник думает, что меньший размер кода означает более быстрое выполнение, он может ошибаться. (stackoverflow.com/questions/1044236/)   -  person GvS    schedule 09.10.2019
comment
Пожалуйста, включите фактическое определение для hotelList. Псевдокод и примеры неопределенного кода могут затруднить предоставление подробного ответа.   -  person Rufus L    schedule 09.10.2019
comment
Если вы уже используете цикл for, почему бы не опубликовать код? Это сделало бы вопрос очень ясным.   -  person John Wu    schedule 09.10.2019
comment
Я разместил kvp и цикл, который я использую   -  person Jayapen Jose    schedule 09.10.2019
comment
Немного не по теме, но я использую библиотеку Json.NET для взаимодействия с JSON из моих вызовов внешнего интерфейса javascript. Это упрощает преобразование JSON в объекты .NET. newtonsoft.com/json   -  person nulltron    schedule 09.10.2019


Ответы (2)


Что ж, способ грубой силы - просто проецировать словарь на объекты путем жесткого кодирования свойств:

List<Hotel> hotaals = hotelList.Select(kvp => new Hotel {
                                    code = kvp['Code'],
                                    name = kvp["Name"]
                                    })
                               .ToList();

Я бы также оспорил то, что ваш «великий начальник» понимает под неэффективным ».

person D Stanley    schedule 08.10.2019

Итак, сначала вы получите свои исходные данные:

var hotelList = keyValuePairs["hotels"];

Затем используйте linq для создания нового списка:

var hotelObjects = hotelList.Select(hotel => new Hotel { code = hotel.key, name = hotel.name});

Теперь, чтобы прояснить, что linq делает под капотом, это итеративный цикл по объектам (как и foreach), который создает новый объект Hotel для каждого элемента в hotelList и возвращает их как IQueryable<Hotel>. Просто примените .ToArray() или .ToList(), если вам не нужен IQueryable<>

Судя по тому, как может показаться, ваш первоначальный список сведений об отеле не структурирован, поэтому вам, возможно, придется изменить предоставленный мной выше запрос linq, чтобы он соответствовал структуре списка.

Вам может понадобиться что-то более близкое к этому:

// Gives IQueryable<Hotel> as result
var hotelObjects = hotelList.Select(hotel => new Hotel{code = hotel["key"], name = hotel["name"]});

// Gives Array<Hotel> as result
var hotelObjects = hotelList.Select(hotel => new Hotel{code = hotel["key"], name = hotel["name"]}).ToArray();

// Gives List<Hotel> as result
var hotelObjects = hotelList.Select(hotel => new Hotel{code = hotel["key"], name = hotel["name"]}).ToList();
person nulltron    schedule 08.10.2019