C# 根据.net中的条件从DTO类对象中筛选或删除数组对象
我有一个API,它以以下格式给出响应:C# 根据.net中的条件从DTO类对象中筛选或删除数组对象,c#,json,linq,asp.net-core,C#,Json,Linq,Asp.net Core,我有一个API,它以以下格式给出响应: [ { "OrderId" : "Order1" "filterOrder": [ "ABC", "XYZ" ], "Details": [ { "id&
[
{
"OrderId" : "Order1"
"filterOrder": [
"ABC",
"XYZ"
],
"Details": [
{
"id": 1
"value": 100,
"filterDetails": [
"Apples",
"Oranges"
]
},
{
"id": 2
"value": 200,
"filterDetails": [
"Banana",
"Blank"
]
}
]
},
{
"OrderId" : "Order2"
"filterOrder": [
"PQR",
"Blank"
],
"Details": [
{
"id": 1
"value": 100,
"filterDetails": [
"Apples",
"Peaches"
]
},
{
"id": 2
"value": 200,
"filterDetails": [
"Banana",
"Mango"
]
},
]
}
]
我收到响应并将其反序列化为一个模型类(与上面的结构相同)。我的要求是从响应中删除所有这些对象,其中过滤器被称为“空白”。
在上面的示例中,输出应该如下所示:
[
{
"OrderId" : "Order1"
"filterOrder": [
"ABC",
"XYZ"
],
"Details": [
{
"id": 1
"value": 100,
"filterDetails": [
"Apples",
"Oranges"
]
}
]
}
]
在网上搜索后,我尝试了几个例子,但无法继续
var item = responseObject.Find(x=>x.filterOrder == "Blank");
responseObject.Remove(item);
但这会导致编译错误。有谁能帮我按要求过滤数据吗。非常感谢。至少有两种方法 如果您知道只有一个项目将包含空白,请使用以下命令:
List<Order> rootobject = JsonConvert.DeserializeObject<List<Order>>(jsonStr);
var itemToRemove = rootobject.Find(x => x.filterOrder.Contains("Blank"));
rootobject.Remove(itemToRemove);
FilterOrder是一个数组,但您正在将其与字符串进行比较。。。那不行。如果要检查数组中是否有要查找的项,请使用“包含”
rootobject.RemoveAll(x => x.filterOrder.Contains("Blank"));
//or
rootobject = rootobject.Where(x => !x.filterOrder.Contains("Blank")).ToList();
void Main()
{
string i = "[{\"OrderId\":\"Order1\",\"filterOrder\": [ \"ABC\", \"XYZ\" ], \"Details\": [ { \"id\": 1, \"value\": 100, \"filterDetails\": [ \"Apples\", \"Oranges\" ] }, { \"id\": 2, \"value\": 200, \"filterDetails\": [ \"Banana\", \"Blank\" ] } ] }, { \"OrderId\": \"Order2\", \"filterOrder\": [ \"PQR\", \"Blank\" ], \"Details\": [ { \"id\": 1, \"value\": 100, \"filterDetails\": [\"Apples\", \"Peaches\" ]}, { \"id\": 2, \"value\": 200, \"filterDetails\": [\"Banana\",\"Mango\"]}]}]";
var lst = JsonConvert.DeserializeObject<List<Root>>(i);
//first level
lst.Where(w => w.filterOrder.Contains("Blank"))
.ToList().ForEach(fe => {lst.Remove(fe);});
//details level
lst.ToList().ForEach(fe =>
{
fe.Details.Where(ww=> ww.filterDetails.Any(a => a.Contains("Blank")))
.ToList().ForEach(details =>
{
fe.Details.Remove(details);
});
});
lst.Dump();
}
public class Detail
{
public int id { get; set; }
public int value { get; set; }
public List<string> filterDetails { get; set; }
public Detail(){
filterDetails = new List<string>();
}
}
public class Root
{
public string OrderId { get; set; }
public List<string> filterOrder { get; set; }
public List<Detail> Details { get; set; }
public Root(){
Details = new List<Detail>();
filterOrder = new List<string>();
}
}
lst.RemoveAll(x => x.filterOrder.Contains("Blank"));
lst.ForEach(fe => {fe.Details.RemoveAll(r=> r.filterDetails.Contains("Blank"));});