【问题标题】:Filtering or removing array objects from the DTO class object based on a condition in .net根据 .net 中的条件从 DTO 类对象中过滤或删除数组对象
【发布时间】:2021-06-01 16:08:33
【问题描述】:

我有一个 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);

但这会产生编译错误。任何人都可以帮助我根据要求过滤数据。非常感谢。

【问题讨论】:

  • FilterOrder 是一个数组,但您正在将它与字符串进行比较......这是行不通的。如果要检查数组是否包含您要查找的项目,请使用 contains

标签: c# json linq asp.net-core


【解决方案1】:
  1. 您的 JSON 示例包含错误(缺少逗号) 我分两步分开(不知道您是否需要从孩子身上删除空白)
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"));});

【讨论】:

    【解决方案2】:

    至少有两种方法。

    如果您知道只有一个项目包含空白,请使用以下内容,

    List<Order> rootobject = JsonConvert.DeserializeObject<List<Order>>(jsonStr);
    var itemToRemove = rootobject.Find(x => x.filterOrder.Contains("Blank"));
    rootobject.Remove(itemToRemove);
    

    请注意,这只会删除“第一次”出现,并将该数组中的其余项目保留为响应中的空白。这是因为Find 只找到第一次出现。 See documentation

    要从包含“Blank”字样的响应中删除“所有”项,您可以使用RemoveAll 方法或Where 子句创建一个新列表,而filterOrder 中不会出现任何Blank。

    rootobject.RemoveAll(x => x.filterOrder.Contains("Blank"));
    
    //or 
    rootobject = rootobject.Where(x => !x.filterOrder.Contains("Blank")).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2019-04-05
      • 2019-09-15
      • 1970-01-01
      • 2011-10-02
      • 2020-12-03
      • 2017-12-01
      相关资源
      最近更新 更多