[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);
}
蛮力的方法是通过对属性进行硬编码将字典投影到对象上:
List<Hotel> hotaals = hotelList.Select(kvp => new Hotel {
code = kvp['Code'],
name = kvp["Name"]
})
.ToList();
我也将挑战效率低下的“大老板”的意思。
所以首先您要获得初始数据:
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();