我还没有很好地掌握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);
}
}
但它看起来似乎很笨拙。我怎样才能让它变得更好?
答案 0 :(得分:3)
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的新列表。
但是,不清楚构建新的PatientMeds
和List<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();