[英]Using linq to filter List of List
我仍然對LINQ不太了解,覺得我的代碼可以優化,因此需要幫助。
我有一個“患者”和“中級班”,每個班級都有一個公開的IsSelected。 這些被包裝在PatientMeds和PatientMeds類中。
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);
}
}
但這似乎“笨拙”。 我怎樣才能使它更好?
您可以使用僅包含選定患者和PatientMeds
新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
所有屬性。
您可以嘗試RemoveAll
patientsMeds
.PatientMedsList
.Where(m => m.Patient.IsSelected)
.ToList()
.ForEach(m => m.Meds.RemoveAll(med => !med.IsSelected));
作為引用類型,盡管您使用ToList()
方法創建了新列表,但它將指向相同的位置。 因此,結果也將反映在patientsMeds
嘗試縮短以下foreach循環
foreach (PatientMeds patientMeds in patientMedsList)
{
patientMeds.Meds.RemoveAll(m => m.IsSelected == false);
}
只需使用:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.