Использование linq для фильтрации List of List

Я до сих пор не очень хорошо разбираюсь в LINQ, и мне показалось, что мой код можно оптимизировать, ища помощь.

У меня есть класс пациентов и меди, у каждого из них есть публичный bool IsSelected. Они завернуты в открытый класс PatientMeds { public Patient Patient ; public List < Med > Meds ; } public class PatientsMeds { public List < PatientMeds > PatientMedsList ; } и List < PatientMeds > patientMedsList = PatientsMeds . PatientMedsList . Где ( x => x . Пациент . IsSelected ) . ToList (); foreach ( PatientMeds patientMeds in patientMedsList ) { var medsToRemove = patientMeds . Meds . Где ( m => m . IsSelected = false ). ToList (); foreach ( Med med in medsToRemove ) { patientMeds . Meds . Удалить ( med ); } } Классы;

ForEach

Я хочу их отфильтровать, поэтому, если Patient.IsSelected == false, то игнорировать его и игнорировать только Meds, где IsSelected == false;

Теперь этот код работает:

RemoveAll

Но это просто кажется «неуклюжим». Как я могу сделать это лучше?

c#,linq,

0

Ответов: 5


3 принят

Я бы использовал методList<PatientMeds> patientMedsList = PatientsMeds.PatientMedsList .Where(x => x.Patient.IsSelected) .ToList(); patientMedsList.ForEach(p=> p.Meds.RemoveAll(m=>!m.IsSelected)); PatientMeds

var selectedPatientsWithSelectedMeds = patientMedsList.Where(p => p.IsSelected)
                                      .Select(p => new PatientMeds
                                      {
                                        Patient = p.Patient,
                                        Meds = p.Meds.Where(m => m.IsSelected).ToList()
                                      })
                                      .ToList();

2

Вы можете создать новый список с новыми Where(p => p.IsSelected)экземплярами, содержащими только выбранных пациентов и медикаментов:

Select(p => new PatientMeds { ... }

Таким образом, PatientMedsединственный выбор выбранных пациентов, а также p.Meds.Where(m => m.IsSelected).ToList()конструкции новых PatientMedsэкземпляров.

Наконец, List<Med>создается новый список только с выбранными медиками.

Но неясно, жизнеспособно ли создание новых new PatientMeds { ... }и PatientMedsэкземпляров. Например, вам нужно будет отобразить все свойства .foreach (PatientMeds patientMeds in patientMedsList) { patientMeds.Meds.RemoveAll(m => m.IsSelected == false); }PatientMeds


1

Попробуйте сократить следующий цикл foreach

RemoveAll

1

Можешь попробовать patientsMeds .PatientMedsList .Where(m => m.Patient.IsSelected) .ToList() .ForEach(m => m.Meds.RemoveAll(med => !med.IsSelected));

ToList()

Как ссылочный тип, несмотря на то, что вы создаете новый список с использованием patientsMedsметода, он будет указывать на то же местоположение. Таким образом, результат также будет отражен в patientsMedsпеременной


0

просто используйте:

var bb = patientMedsList.Where(p => p.Patient.IsSelected).ToList().Select(p => new PatientMeds { Patient = p.Patient, Meds = p.Meds.Where(m => m.IsSelected).ToList() }).ToList();
C #, LINQ,
Похожие вопросы