使用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);
}
}
但是它看起来很"笨拙"。我怎样才能做得更好?
我将使用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()
构建了一个仅包含选定药物的新列表。
但目前尚不清楚构建新的PatientMeds
和List<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();