使用linq筛选列表的列表

本文关键字:列表 筛选 linq 使用 | 更新日期: 2023-09-27 18:13:04

我还没有很好地掌握LINQ,我觉得我的代码可以优化,所以寻求帮助。

我有一个病人和医学类,每个都有一个公共bool IsSelected。它们被包装到PatientMeds和PatientsMeds类中;

public class PatientMeds
{
    public Patient Patient;
    public List<Med> Meds;
}
public class PatientsMeds
{
    public List<PatientMeds> PatientMedsList;
}

我想过滤这些,所以如果病人。IsSelected == false则忽略它,并且只忽略IsSelected == false;

现在,这段代码工作了:

List<PatientMeds> patientMedsList = PatientsMeds.PatientMedsList
    .Where(x => x.Patient.IsSelected)
    .ToList();
foreach (PatientMeds patientMeds in patientMedsList)
{
    var medsToRemove = patientMeds.Meds.Where(m => m.IsSelected == false).ToList();
    foreach (Med med in medsToRemove)
    {
        patientMeds.Meds.Remove(med);
    }
}

但是它看起来很"笨拙"。我怎样才能做得更好?

使用linq筛选列表的列表

我将使用ForEach RemoveAll方法

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();

因此,Where(p => p.IsSelected)只选择选定的患者,而Select(p => new PatientMeds { ... }构建新的PatientMeds实例。

最后p.Meds.Where(m => m.IsSelected).ToList()构建了一个仅包含选定药物的新列表。

但目前尚不清楚构建新的PatientMedsList<Med>实例是否可行。例如,在new PatientMeds { ... }中,您需要映射PatientMeds的所有属性。

尝试缩短以下foreach循环

foreach (PatientMeds patientMeds in patientMedsList)
{
    patientMeds.Meds.RemoveAll(m => m.IsSelected == false);   
}

你可以试试RemoveAll

patientsMeds
    .PatientMedsList
    .Where(m => m.Patient.IsSelected)
    .ToList()
    .ForEach(m => m.Meds.RemoveAll(med => !med.IsSelected));

作为引用类型,尽管您使用ToList()方法创建了新的列表,但它将指向相同的位置。因此,结果也将反映在patientsMeds变量

直接使用

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();