【问题标题】:Filter nested multiple list c#过滤嵌套的多个列表c#
【发布时间】:2020-08-22 03:55:50
【问题描述】:

我在 c# 中有以下类数据。下面是相同的json格式。

{
   "Data": {
      "plans": [
         {
            "pDecision": "E",
            "pNumber": 123,
            "car": [
               {
                  "iNumber": 1,
                  "liList": [
                     {
                        "CID": 112658799,
                        "liDecision": "A"
                     },
                     {
                        "CID": 112658800,
                        "liDecision": "A"
                     }
                  ]
               },
               {
                  "iNumber": 2,
                  "liList": [
                     {
                        "CID": 1,
                        "liDecision": "E"
                     },
                     {
                        "CID": 2,
                        "liDecision": "A"
                     }
                  ]
               }
            ]
         }
      ]
   }
}

我想了解汽车和计划的详细信息。汽车对象应使用
过滤 “CID”:1 和“liDecision”:“E”。尝试使用任何但它返回所有字段。因为这是收藏 Data.plan.where(p=>p.car.any(c=>c.lilist.any(l=>l.cid==1 && l.lidecesion=="E")));试过这个。 有什么帮助吗?

【问题讨论】:

  • 我可以看到你的问题,你没有任何代码......只是一个 json 和一个愿望。你试过什么?

标签: c# asp.net linq


【解决方案1】:

您的Where 返回一个可枚举的计划,而不是汽车,并且您的计划实例包含两辆汽车。如果您想过滤汽车,您需要将您的Where 应用于汽车收藏

Data.plans.SelectMany(p => p.car)
.Where(c => c.lilist.Any( li => li.cid==1 && li.lidecesion=="E"));

如果您还需要包含该车的计划

Data.plans.SelectMany(p => p.car.Select(c => new {Car = c, Plan = p})) // this returns cars with according plans
.Where(x => x.Car.lilist.Any(li => li.cid==1 && li.lidecesion=="E"));

您将获得对象对 { Car, Plan },Plan 属性仍将拥有完整的汽车集合,但 Car 应该满足您的过滤器。

【讨论】:

  • 解决方案很好?...但是首先过滤汽车之前似乎更有效> 生成辅助 Car/Plan 对象,避免生成未使用的对象:` Data.plans.SelectMany(p => p.car.Where(x => x.Car.lilist.Any(li => li.cid==1 && li.lidecesion=="E")).Select(c => new {Car = c; Plan = p})); `
  • @Cicher,同意,你的版本效率更高
【解决方案2】:

感谢您提及您已经尝试过的内容 :-)。也许您可以将其添加到原始问题中,然后作为评论保留???

您有嵌套列表,一种方法是将它们展平,然后对展平结果进行过滤

考虑以下代码,它首先对 Plans 进行平面化,然后对 LiLists 进行平面化,最后对结果进行过滤

var plans = carPlans.Data.Plans.SelectMany(plan => plan.Car) .SelectMany(e => e.LiList).Where(list => list.Cid == 1 && list.LiDecision == "E");

希望对你有帮助

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多