Как преобразовать пару ключ-значение в пользовательский список объектов - PullRequest
1 голос
/ 09 октября 2019

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

// Вот откуда данные: -

   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);
 }

Ответы [ 2 ]

1 голос
/ 09 октября 2019

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

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

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

1 голос
/ 09 октября 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();
...