使用linq过滤列表列表

时间:2016-10-13 11:20:30

标签: c# linq

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

我有一个患者和医学课,每个人都有一个公共布尔选择。这些包含在PatientMeds和PatientsMeds类中;

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

public class PatientsMeds
{
    public List<PatientMeds> PatientMedsList;
}

我想过滤这些,所以如果Patient.IsSelected == false然后忽略它,并且只忽略其中IsSelected == false的Meds;

现在,此代码有效:

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

但它看起来似乎很笨拙。我怎样才能让它变得更好?

5 个答案:

答案 0 :(得分:3)

我会使用ForEach RemoveAll方法

List<PatientMeds> patientMedsList = PatientsMeds.PatientMedsList
    .Where(x => x.Patient.IsSelected)
    .ToList();
patientMedsList.ForEach(p=> p.Meds.RemoveAll(m=>!m.IsSelected));

答案 1 :(得分:2)

您可以使用仅包含选定患者和药物的新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()构建一个仅包含选定meds的新列表。

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

答案 2 :(得分:1)

您可以尝试RemoveAll

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

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

答案 3 :(得分:1)

尝试缩短以下foreach循环

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

答案 4 :(得分: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();