如何将键值对转换为自定义对象列表

问题描述 投票:0回答:2

[enter image description here我有一个Hotel详细信息的keyValupair;:

//这是数据来自的地方:-

   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);
 }
c# json dictionary serialization keyvaluepair
2个回答
1
投票

蛮力的方法是通过对属性进行硬编码将字典投影到对象上:

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

我也将挑战效率低下的“大老板”的意思。


1
投票

所以首先您要获得初始数据:

var hotelList = keyValuePairs["hotels"];

然后使用linq创建新列表:

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

现在要弄清楚linq在后台执行的操作是一个遍历对象的迭代循环(就像foreach一样,并为hotelList中的每个项目创建一个新的Hotel对象,并将其返回为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();
© www.soinside.com 2019 - 2024. All rights reserved.