Фильтр вложенных множественных списков c# - PullRequest
0 голосов
/ 07 мая 2020

У меня есть данные класса ниже в 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")) ); пробовал это. любая помощь?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Ваш 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"));

Вы получите объекты - Pair {Car, Plan}, свойство Plan по-прежнему будет содержать полную коллекцию автомобилей, но Car должен удовлетворять вашему фильтру.

0 голосов
/ 07 мая 2020

Спасибо, что упомянули о том, что вы уже пробовали :-). Может быть, вы можете добавить его к исходному вопросу, а затем сохранить в качестве комментария ???

У вас есть вложенные списки, и один из подходов состоит в том, чтобы сгладить их, а затем отфильтровать плоские результаты

Рассмотрим следующий код, он сначала сбрасывает планы, затем LiLists и, наконец, выполняет фильтрацию по результату

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

Надеюсь, это поможет

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...