C# 根据.net中的条件从DTO类对象中筛选或删除数组对象

C# 根据.net中的条件从DTO类对象中筛选或删除数组对象,c#,json,linq,asp.net-core,C#,Json,Linq,Asp.net Core,我有一个API,它以以下格式给出响应: [ { "OrderId" : "Order1" "filterOrder": [ "ABC", "XYZ" ], "Details": [ { "id&

我有一个API,它以以下格式给出响应:

[
    {
        "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);
  • 您的JSON示例包含错误(缺少逗号) 我分为两步(不知道是否需要从孩子身上删除空格)

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