我有以下模型類
public class Hotel
{
public string hoteltype { get; set; }
public List<Room> rooms { get; set; }
}
public class Room
{
public Room2 room { get; set; }
public string name { get; set; }
}
public class Room2
{
public int number { get; set; }
public string category { get; set; }
public string subCategory { get; set; }
}
public class Root
{
public List<Hotel> hotels { get; set; }
}
下面是JSON
{
"hotels": [
{
"hoteltype": "5star",
"rooms": [
{
"room": {
"number": 1,
"category": "Deluxe",
"subCategory": "type1"
},
"name": "xyz"
},
{
"room": {
"number": 2,
"category": "Deluxe",
"subCategory": "type2"
},
"name": "abc"
}
]
},
{
"hoteltype": "4star",
"rooms": [
{
"room": {
"number": 1,
"category": "Small",
"subCategory": "type1"
},
"name": "xyz"
},
{
"room": {
"number": 2,
"category": "Small",
"subCategory": "type4"
},
"name": "abc"
}
]
},
{
"hoteltype": "5star",
"rooms": [
{
"room": {
"number": 1,
"category": "Deluxe",
"subcategory": "type4"
},
"name": "xyz"
},
{
"room": {
"number": 2,
"category": "Deluxe",
"subcategory": "type5"
},
"name": "abc"
}
]
}
]
}
預期輸出:
{
"hotels": [
{
"hoteltype": "5star",
"rooms": [
{
"room": {
"number": 1,
"category": "Deluxe",
"subCategory": null
},
"name": "xyz"
},
{
"room": {
"number": 2,
"category": "Deluxe",
"subCategory": null
},
"name": "abc"
}
]
},
{
"hoteltype": "4star",
"rooms": [
{
"room": {
"number": 1,
"category": "Small",
"subCategory": null
},
"name": "xyz"
},
{
"room": {
"number": 2,
"category": "Small",
"subCategory": null
},
"name": "abc"
}
]
}
]
}
我正在嘗試使用 LINQ - groupby 和 firstordefault 洗掉重復項。groupby 應該在房間號和類別上,而不是在酒店型別上。因為我們需要hoteltype、room number和category的組合,如果這三個組合在JSON中應該去掉
請提出任何解決方案?
uj5u.com熱心網友回復:
Distinct()方法完全是為了這個目的而存在的。
您可以在 Hotel 中創建比較器或覆寫 Equals,但我將舉一個后者的示例。
public class Hotel : IEquatable<Hotel>
{
public string hoteltype { get; set; }
public List<Room> rooms { get; set; }
public bool Equals(Hotel other)
{
if (hoteltype != other.hoteltype) return false;
if (rooms.Length != other.rooms.Length) return false;
for (int i = 0; i < rooms.Length; i )
{
if (!rooms[i].Equals(other.rooms[i]) return false;
}
return true;
}
}
您還必須為房間撰寫一個相等的覆寫。
public class Room : IEquatable<Room>
{
public Room2 room { get; set; }
public string name { get; set; }
public bool Equals(Room other)
{
return name == other.name &&;
room.Equals(other.room);
}
}
public class Room2 : IEquatable<Room2>
{
public int number { get; set; }
public string category { get; set; }
public string subCategory { get; set; }
public bool Equals(Room2 other)
{
return number == other.number &&;
category == other.category &&
subCategory == other.subCategory;
}
}
uj5u.com熱心網友回復:
我正在嘗試使用 LINQ - groupby 和 firstordefault 洗掉重復項。groupby 應該在房間號和類別上,而不是在酒店型別上。因為我們需要hoteltype、room number和category的組合,如果這三個組合在JSON中應該去掉
根據您的問題,您需要一個 Linq GroupBy on room => number, room => category。
var grp = rooms.GroupBy(
room => room.number,
room => room.category,
(rm_num, rm_cat) => new
{
num = rm_num,
cat = rm_cat
});
foreach(var result in grp) {
Console.WriteLine(result.num " " result.cat);
}
uj5u.com熱心網友回復:
這可能已關閉,但我是否建議您將 Enumeration 的資料型別更改為 HashSet 酒店?哈希集不能有重復項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/485055.html
